ORM关系和缺乏更好的理解
ORM relations and lacking a better understanding
我有以下型号
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"
);
}
电影
<?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 它就会起作用 - 无论 是哪一侧 。
我有以下型号
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"
);
}
电影
<?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 它就会起作用 - 无论 是哪一侧 。