ORM关系并缺乏更好的理解

zan*_*war 1 silverstripe

我有以下型号

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

如果我应该使用has_many或,我就无法解决many_many.

我的尝试

流派

<?php

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

    private static $has_many = array(
        "Movies" => "Movie"
    );
}
Run Code Online (Sandbox Code Playgroud)

电影

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

}
Run Code Online (Sandbox Code Playgroud)

ProductionCompanies

<?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"
    );
}
Run Code Online (Sandbox Code Playgroud)

文档说明:

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

但我在这里的误解是,我的模特中没有一个"有一个",它们都有很多

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

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

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

任何帮助表示赞赏!

小智 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'
    );
}
Run Code Online (Sandbox Code Playgroud)

如果双方可以"拥有很多"彼此,那么你将需要多对多.有一对多仅适用如果关系的一面永远只能与一个对方.

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