JOIN查询那个returns不同型号的对象列表?
JOIN query that returns list of objects of different models?
到目前为止我有这个代码:
$list = $this->modelsManager
->createBuilder()
->columns(array("SeriesList.*", "User.*", "Entry.*"))
->from("SeriesList")
->join("User")
->join("Entry")
->andWhere("SeriesList.id = '$id'")
->getQuery()
->execute();
"Entry" 数据库中的每一行都是一个项目,它有一个 id,它所属的系列列表的 id,它的系列 id,以及它是什么类型的系列。系列的类型指定了table 可以在其中找到系列 ID。
问题是我希望 SeriesList(s) 可以包含不同类型的对象。例如,SeriesList "Favorites" 可能包含 3 个节目和 4 本书,Show 和 Book 是不同的模型,它们与单独的 table 接口。
我是否必须继续加入列表可能包含的所有模型?或者有更好的方法吗?
查询构建器将 return 一个结果集,它可以是一个模型本身或一个组合模型(如果您正在进行连接等)。它不会 return 其他模型的对象。
您可以使用 getRelated()
函数从基本模型本身访问关系。
因此,如果您的起点是 Entry
,那么您可以这样做:
$entries = Entries::find();
foreach ($entries as $entry) {
// If series type is X
if ($entry->seriesType == 'x') {
$newItem = $entry->getRelated('x');
} else if ($entry->seriesType == 'y') {
$newItem = $entry->getRelated('y');
}
}
您可以在模型中定义满足这一要求的关系。这里的关键是 Phalcon 的关系将直接关联从 table A 到 table B 的数据,而没有任何 "filtering"。因此,如果你想将 Entries
与 Favorites
相关联,如果 SeriesList == 'favorite'
你不能,至少是自动的。您将必须使用类似于上述代码的代码来执行此操作。
到目前为止我有这个代码:
$list = $this->modelsManager
->createBuilder()
->columns(array("SeriesList.*", "User.*", "Entry.*"))
->from("SeriesList")
->join("User")
->join("Entry")
->andWhere("SeriesList.id = '$id'")
->getQuery()
->execute();
"Entry" 数据库中的每一行都是一个项目,它有一个 id,它所属的系列列表的 id,它的系列 id,以及它是什么类型的系列。系列的类型指定了table 可以在其中找到系列 ID。
问题是我希望 SeriesList(s) 可以包含不同类型的对象。例如,SeriesList "Favorites" 可能包含 3 个节目和 4 本书,Show 和 Book 是不同的模型,它们与单独的 table 接口。
我是否必须继续加入列表可能包含的所有模型?或者有更好的方法吗?
查询构建器将 return 一个结果集,它可以是一个模型本身或一个组合模型(如果您正在进行连接等)。它不会 return 其他模型的对象。
您可以使用 getRelated()
函数从基本模型本身访问关系。
因此,如果您的起点是 Entry
,那么您可以这样做:
$entries = Entries::find();
foreach ($entries as $entry) {
// If series type is X
if ($entry->seriesType == 'x') {
$newItem = $entry->getRelated('x');
} else if ($entry->seriesType == 'y') {
$newItem = $entry->getRelated('y');
}
}
您可以在模型中定义满足这一要求的关系。这里的关键是 Phalcon 的关系将直接关联从 table A 到 table B 的数据,而没有任何 "filtering"。因此,如果你想将 Entries
与 Favorites
相关联,如果 SeriesList == 'favorite'
你不能,至少是自动的。您将必须使用类似于上述代码的代码来执行此操作。