Laravel从模型中获取数据,其中condtions来自另一个模型

时间:2016-04-18 06:01:41

标签: php laravel model controller

我有一个名为List的表,我打算用这个命令显示到视图中:$lists= List::with('user', 'product.photodb', 'tagCloud.tagDetail')->get();。但是,我希望显示的数据只是TagID等于一个用户输入的数据。可以从TagCloud表中检索这些数据。

我目前正在做的是:

$clouds = TagCloud::select('contentID')
                  ->where('tagDetailID', '=', $tagID)
                  ->get();

$lists = List::with('user', 'product.photodb', 'tagCloud.tagDetail')
             ->where('id', '=', $clouds->contentID)
             ->get();

但是当我试图运行它时,它只返回一个空值,即使我在做return $clouds时,它确实返回了所需的ID。

我哪里做错了?任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

您目前的解决方案有几个问题。

  1. 使用get()会返回Illuminate\Database\Eloquent\Collection个对象。因此,您无法直接使用$clouds->contentID,因为$clouds是一个集合(或者您喜欢的数组)。 See Collection Documentation.
  2. where(...)要求第三个参数为字符串整数,即单个值。相反,您传递的是collection,这将无效。
  3. 正确的方法是使用whereHas(),它允许您过滤积极的加载关系。

    最终代码:

    $lists = List::with('user', 'product.photodb', 'tagCloud.tagDetail')
                ->whereHas('tagCloud',function($query) use ($tagID) {
                    return $query->where('contentID','=',$tagID);
                })
                ->get();
    

    See WhereHas Documentation.

答案 1 :(得分:0)

你想要的是whereHas()

$list = List::with(...)
    ->whereHas('relation', function($q) use($id) {
        return $q->where('id', $id);
    })->get();

答案 2 :(得分:0)

在tagCloud模型方法tagDetail中应用Where where条件

public function tagDetail(){
    return $q->where('id', $id);
}