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

  • 照片的桌子.
  • 泰格的桌子.
  • photo_标签关系表.

现在,我正在努力用一组标签来标记所有照片.我的 idea 是用标签列表向我的API发出请求,并获得至少包含所有标签的照片列表.

我一直在找whereIn号接线员.

这是我的代码(现在都是硬编码的):

$photos = Photo::whereHas('tags', function (Builder $query) {
            $query->whereIn('tag', ['a5', 'mate', 'Brillante']);
        })->get();

        return response()->json($photos, 200);

当我执行它时,它会返回与一个标记匹配的所有照片,我只需要拥有所有请求标记的照片(在本例中为a5,mate).

我正在研究拉威尔9号.

编辑:

正如我建议的那样,蒂姆·刘易斯try 过循环:

$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()方法与提供的any个值相匹配,而不是all个值,因此需要修改此值.具体化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' => []数组),这个查询将 for each 标记包含一个whereHas()子句,并且只返回包含所有指定标记的Photo条记录.

Laravel相关问答推荐

未将Laravel Blade属性传递给组件或类

如何访问 Validator::extend 中的其他输入属性?

在 apache docker 容器中运行虚拟主机

Laravel 中间件返回(try 获取非对象的属性 headers)错误

Laravel 5.1 如何在Blade 文件上使用 {{ old('') }} 助手进行无线电输入

Laravel 5.3 - 将多个文件附加到 Mailables

升级到 laravel 5.4 后调用未定义的方法

laravel 中的 Http Post 使用 fetch api 给出 TokenMismatchException

Laravel 中的合同和 PHP 中的接口有什么区别?

删除表后如何重新迁移laravel迁移

在 laravel 6.0 中未定义命令ui

我如何从给定的日期时间 struct 创建Carbon 对象?

如何处理 php (Laravel api) 和 javascript (AngularJS) 之间的日期时间

laravel 5.1 在没有 VM 重启的情况下看不到作业(job)文件的更改

如何从 Laravel 中的资源中获取图像?

Lumen/Laravel 6:调用未定义的函数 array_except()

Laravel 删除集合中的第一项

Laravel 5 默认注册后如何发送邮件?

Laravel 5如何获取路由动作名称?

如何从 PHPUnit 测试设置运行 Laravel 数据库 seeder 机?