Laravel复杂的查询与雄辩

时间:2015-09-29 22:13:29

标签: php laravel eloquent

我是laravel和eloquent的新手,我无法找到我想要做的事情的例子,假设我有三张桌子ABC,所有这些都有很多对很多关系发货A - ab - B - bc - C.

ab : table contains key from A and B.
bc : table contains key from B and C.

如果我想使用A(a_id = 1)找到C对象怎么办?

我尝试了类似A::find(1) -> B() -> C()->get() ;

的内容
B() is method i created to get B objects in A model.
C() is method i created to get C objects in B model.

我做错了什么? 我希望问题和例子都很清楚。

最好的问候。

1 个答案:

答案 0 :(得分:1)

Eloquent提供hasManyThrough关系快捷方式,但仅支持模型之间的一对多关系。 Laravel.io论坛上this thread有各种解决方法。以下是我已经测试过的that thread的简短解决方案。这需要添加到模型将扩展的基础模型中:

public function manyThroughMany($related, $through, $firstKey, $secondKey, $pivotKey)
{
    $model = new $related;
    $table = $model->getTable();
    $throughModel = new $through;
    $pivot = $throughModel->getTable();

    return $model
        ->join($pivot, $pivot . '.' . $pivotKey, '=', $table . '.' . $secondKey)
        ->select($table . '.*')
        ->where($pivot . '.' . $firstKey, '=', $this->id);
}

然后在A模型上,您可以定义一个返回此关系的关系方法:

public function c()
{
    return $this->manyThroughMany('C', 'B', 'b_id', 'id', 'c_id');
}

并按如下方式访问相关条目:

A::find(1)->c()->get();

在这个帖子中也有一个class defining a relation用于这个目的,但我没有测试过,所以我不能说它是否正常工作。