在laravel中组合查询结果

时间:2017-01-15 03:43:23

标签: php mysql laravel

在我的网站上,用户可以上传图片并将标签附加到这些图片上。

我有一个图像表,一个标签表和一个images_tag数据透视表。

图像可以包含许多标签,标签可以属于许多图像。

我希望能够生成用户在他/她的图像中使用的所有标签的列表。

$imageIDs = Images::where('created_by', Auth::user()->id)->lists('id');

因此,这将创建用户上传的所有图像ID的列表。

我想要的实际上是“foreach $ imageIDs,检查images_tag表格,每次匹配都转到tags表格,然后返回标记名值。”

但我不知道我该怎么做。

也许foreach然后在所有结果上使用merge方法?任何帮助,将不胜感激!

2 个答案:

答案 0 :(得分:1)

你能做的就是这个。

class Tag extends Model
{
    public function images()
    {
        return $this->belongsToMany(Image::class);
    }
}

class SomeController
{
    public function someMethod()
    {
        $tags = Tag::with(['images' => function ($image) {
            return $image->where('created_by', Auth::user()->id);
        }])->select('id', 'tagname')->get();
        // these are your $tags 
    }
}

您不应在foreach()内使用查询。然后它会产生N+1 problem。你所做的是使用with()语句急切加载。

答案 1 :(得分:1)

您需要使用whereHas()来检查关系:

$userTags = Tags::whereHas('images', function($q) {
    $q->where('created_by', auth()->user()->id);
})->get();

然后将此数据传递给视图:

return view('some.view', compact('userTags'));

在视图中迭代标记:

@foreach ($userTags as $tag)
    {{ $tag->name }}
@endforeach