ORM关系和缺乏更好的理解

ORM relations and lacking a better understanding

我有以下型号

我不知道应该使用 has_many 还是 many_many

我的尝试

流派

<?php

class Genres extends DataObject {
    private static $db = array(
        "GenreId" => "Int",
        "Name" => "Varchar"
    );

    private static $has_many = array(
        "Movies" => "Movie"
    );
}

电影

<?php
class Movies extends DataObject {

    private static $db = array(
        "Status" => "Varchar",
        "Tagline" => "Varchar",
        "Title" => "Varchar",
        "Video" => "Varchar",
        "VoteAverage" => "Decimal",
        "VoteCount" => "Int"
    );

    private static $has_many = array(
        "ProductionCompanies" => "ProductionCompany",
        "Genres" => "Genre"
    );

}

制作公司

<?php

class ProductionCompanies extends DataObject {
    private static $db = array(
        "CompanyId" => "Int",
        "Description" => "Text",
        "Headquarters" => "Varchar",
        "Homepage" => "Varchar",
        "LogoPath" => "Varchar",
        "Name" => "Varchar",
    );

    private static $has_many = array(
        "Movies" => "Movie"
    );
}

文档状态:

Please specify a $has_one-relationship on the related child-class as well, in order to have the necessary accessors available on both ends.

但是我这里的误解是我的none个模型"has one",它们都有很多

我想显示一个流派列表,其中有一个与该流派相关联的电影列表

我还想要一个制作公司列表,其中有一个与该公司相关的电影列表。

而且我还希望一部电影能够与一种或多种类型and/or制作公司联系起来。

感谢任何帮助!

这里你需要多对多:

<?php

class Genre extends DataObject {
    private static $many_many = array(
        'Movies' => 'Movie'
    );
}

class Movie extends DataObject {
    private static $belongs_many_many = array(
        'Genres' => 'Genre',
        'ProductionCompanies' => 'ProductionCompany'
    );
}

class ProductionCompany extends DataObject {
    private static $many_many = array(
        'Movies' => 'Movie'
    );
}

如果双方可以 "have many" 对方,那么您将需要多对多。 has-many 仅适用于关系的一方只能与另一方的 one 相关的情况。

文档解释了何时最好使用 many_many 或 belongs_many_many:https://docs.silverstripe.org/en/3.4/developer_guides/model/relations/#many-many-or-belongs-many-many。我完全忽略了它们并做了相反的事情 :D(因为一部电影 属于 一家制作公司,而不是相反)。区别不是太重要,只要一侧有 many_many 它就会起作用 - 无论 是哪一侧