gpt4 book ai didi

Laravel 查询多对多关系

转载 作者:行者123 更新时间:2023-12-05 04:33:28 24 4
gpt4 key购买 nike

我有一个 API 来跟踪照片和标签。每张照片可以有 N 个标签,一个标签可以链接到 N 张照片。这是使用 3 个表完成的:

  • 照片表。
  • 标签的表格。
  • photo_tag 关系表。

现在我正在努力让所有照片都用一组标签标记,我的想法是使用标签列表向我的 API 发出请求,并获取至少包含所有标签的照片列表。

我一直在尝试使用 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() 方法匹配提供的值中的任何,而不是所有,您需要修改它。指定一些 whereHas() 子句,每个标签 1 个,应该有效:

$photoQuery = Photo::query();
foreach ($request->input('tags') as $tag) {
$photoQuery = $photoQuery->whereHas('tags', function ($query) use ($tag) {
return $query->where('tag', $tag);
});
}
$photos = $photoQuery->get();

现在,根据发送到您的 API 的 tags(假设通过 $request 变量作为 'tags' => [] 数组),此查询将为每个标签包含一个 whereHas() 子句,并且仅返回具有所有指定标签的 Photo 记录。

关于Laravel 查询多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71412836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com