ORM关系并缺乏更好的理解

时间:2016-09-30 11:46:44

标签: silverstripe

我有以下型号

  • $bar(可以有一部或多部电影)
  • Genres(可以有一个或多个类型或制作公司
  • Movies(可以有很多电影)

如果我应该使用ProductionCompanieshas_many,我就无法解决。

我的尝试

流派

many_many

<?php

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

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

ProductionCompanies

<?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"
    );

}

文档声明:

  

请在相关的子类上指定$ has_one-relationship,以便在两端都有必要的访问者。

但我的误解是,我的模特中没有一个“有一个”,它们都有很多

我想显示一个类型列表,其中包含与该类型相关联的电影列表

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

我还希望电影能够与一个或多个类型和/或制作公司联系。

感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

你需要一个多对多的地方:

<?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'
    );
}

如果双方可以“拥有很多”,那么你需要多对多。 has-many仅在关系的一方只能与另一方的一个相关时才适用。

文档说明何时最好使用many_many或belongs_many_many:https://docs.silverstripe.org/en/3.4/developer_guides/model/relations/#many-many-or-belongs-many-many。我完全忽略了它们并做了相反的事情:D(因为电影属于到制作公司,而不是相反)。区别并不太重要,只要一方有多少就可以工作 - 无论哪个方面都在。