我有一个API用于跟踪照片和标签。每张照片可以有N个标签,而一个标签可以与N张照片相关联。这是通过3个表完成的:
我一直在尝试使用
这是我的代码(现在全部硬编码):
- 照片表。
- 标签表。
- 照片和标签关系表。
我一直在尝试使用
whereIn
操作符。这是我的代码(现在全部硬编码):
$photos = Photo::whereHas('tags', function (Builder $query) {
$query->whereIn('tag', ['a5', 'mate', 'Brillante']);
})->get();
return response()->json($photos, 200);
当我执行它时,它返回与一个标签匹配的所有照片,而我只需要拥有所有请求标签的照片(在这个例子中是a5,mate)。
我正在使用Laravel 9。
编辑:
如Tim Lewis建议的那样,我已经尝试了循环:
$tags = array("a5", "mate", "Brilante");
$photoQuery = Photo::query();
foreach($tags as $tag) {
\Log::debug($tag);
$photoQuery->whereHas('tags', function($query) use ($tag) {
return $query->where('tag', $tag);
});
}
$photos = $photoQuery->get();
现在它返回了一个空列表,我认为是因为它正在寻找仅具有我在数组中硬编码的3个标签的照片。
编辑2:
看起来这些更改是正确的,但出于某种原因,Postman没有显示出这些更改的任何结果,也没有解决我的问题。
whereIn()
匹配任何一个选项,而不是所有选项。如果您需要匹配所有选项,则可能需要 3 个whereHas()
子句,每个子句检查一个标签。 - Tim LewiswhereHas()
子句。我看到你说目前是硬编码的,但是将其变为动态的并不困难。 - Tim Lewis$photoQuery = $photoQuery->whereHas(...);
。同时,请检查您的拼写:Brillante
与Brilante
。 - Tim Lewis