dongzhanlian6289 2015-01-06 19:12
浏览 26
已采纳

JOIN查询返回不同模型的对象列表?

So far I have this code:

$list = $this->modelsManager
             ->createBuilder()
             ->columns(array("SeriesList.*", "User.*", "Entry.*"))
             ->from("SeriesList")
             ->join("User")
             ->join("Entry")
             ->andWhere("SeriesList.id = '$id'")
             ->getQuery()
             ->execute();

Each row in the "Entry" database is an item that has a id, id of the series list it belongs to, its series id, and what type of series it is. The type of series specifies what table the series id can be found in.

The problem is that I want SeriesList(s) to may contain different types of objects. For example, the SeriesList "Favorites" may contain 3 shows and 4 books, Show and Book being different models which interface with separate tables.

Would I have to keep joining for all the models the list might contain? Or is there a better way?

  • 写回答

1条回答 默认 最新

  • dongqing6661 2015-01-07 13:38
    关注

    The query builder will return a resultset which could be a model itself or a combined model (if you are doing joins etc.). It will not return objects of other models.

    What you can do is use the getRelated() function to access the relationships from the base model itself.

    So if your starting point is Entry then you could do something like this:

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

    You can define relationships in your models that will cater for that. The key here is that Phalcon's relationships will relate data from table A to table B straight up and without any "filtering". So if you want to relate Entries to Favorites if SeriesList == 'favorite' you cannot, at least automatically. You will have to do that with code similar to the one above.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?