在我的网站上,用户可以上传图片并将标签附加到这些图片上。
我有一个图像表,一个标签表和一个images_tag数据透视表。
图像可以包含许多标签,标签可以属于许多图像。
我希望能够生成用户在他/她的图像中使用的所有标签的列表。
$imageIDs = Images::where('created_by', Auth::user()->id)->lists('id');
因此,这将创建用户上传的所有图像ID的列表。
我想要的实际上是“foreach $ imageIDs,检查images_tag表格,每次匹配都转到tags表格,然后返回标记名值。”
但我不知道我该怎么做。
也许foreach然后在所有结果上使用merge方法?任何帮助,将不胜感激!
答案 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