【问题标题】:JOIN query that returns list of objects of different models?JOIN 查询返回不同模型的对象列表?
【发布时间】:2015-01-06 19:12:04
【问题描述】:

到目前为止,我有这个代码:

$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 以及它是什么类型的系列。系列的类型指定可以在哪个表中找到系列 ID。

问题是我希望 SeriesList(s) 可能包含不同类型的对象。例如,SeriesList "Favorites" 可能包含 3 个节目和 4 本书,Show 和 Book 是不同的模型,它们与不同的表格交互。

我是否必须继续加入列表中可能包含的所有模型?还是有更好的办法?

【问题讨论】:

  • “它所属的系列列表的 ID”与其“系列 ID”有何不同
  • @Strawberry SeriesList 是一个模型。每个 SeriesList 都有一个名称和一个 id,该 id 在您的问题中称为前者。系列 id 是一个 slug(我本可以使用整数,但我决定将主键 id 和 slug 的目的结合起来以使事情变得更容易)这是其系列的唯一主键,无论是Show 或 Book 或我稍后会添加的其他系列课程。

标签: php mysql sql phalcon


【解决方案1】:

查询构建器将返回一个结果集,该结果集可能是模型本身或组合模型(如果您正在执行连接等)。它不会返回其他模型的对象。

您可以使用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 的关系会将表 A 和表 B 的数据直接关联起来,并且没有任何“过滤”。因此,如果您想将EntriesFavorites 相关联,而SeriesList == 'favorite' 则不能,至少是自动的。您必须使用与上述类似的代码来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多