两个联盟之间雄辩的关系

时间:2016-06-17 18:38:48

标签: laravel eloquent laravel-5.2

我有四个型号。 TableFoo和TableFooArchive共享一个公共模式(TableFoo的项目定期移动到TableFooArchive)。我也有TableBar和TableBarArchive。 TableFoo在TableBar或TableBarArchive中可能有也可能没有一个相关的行。 TableFooArchive在TableBarArchive中可能有也可能没有一个相关的行。

我希望能够使用Eloquent将TableFoo和TableFooArchive联合起来,然后急切加载TableBar和TableBarArchive的联合。如果我只有TableFoo和TableBar,我可以在模型上设置一个hasOne并完成。我怎样才能在所有四个表中实现相同的目标?

我的开始是拥有一个包含以下内容的存储库:

public function getData($id)
{
    $a = TableFoo::selectRaw('
        columnA,
        columnB as column_b_abc,
        columnB as colum_b_def,
        created_at
    ')
    ->whereRaw("
        id = $id,
        and so forth...
    ");

    $b = TableFooArchive::selectRaw('
        columnA,
        columnB as column_b_abc,
        columnB as colum_b_def,
        created_at
    ')
    ->whereRaw("
        id = $id,
        and so forth...
    ")
    ->unionAll($a)
    ->orderBy('created_at', 'DESC')
    ->get();

    return $b;
}

我的猜测是,可以在每个返回TableBarTableBarArchive的模型上定义一个方法。我只是不确定我会怎么做,也不知道如何使用 - > with('unionedResults')来完成上述操作。 FWIW,我无法将表结构更改为使用两个而不是四个。

我觉得可能有一个明显而简单的解决方案,目前还没有发生在我身上。任何帮助或见解将不胜感激!

更新: 我正在寻找的是懒惰加载关系。只要您在相关模型上定义了正确的方法,上面的示例即可实现此目的。

看到一个急切加载整个事物的例子仍然很有趣。

0 个答案:

没有答案