【发布时间】:2014-09-02 10:56:55
【问题描述】:
我正在开发一个列出图像的应用程序,并为每个图像分配了多个标签。我希望能够找到标有所有正在搜索的标签的图像。
images表
- id
- download_url
- image_width
- image_height
tags表
- id
- name
image_tag表
- id
- image_id
- tag_id
在我的Image 模型中,我有belongsToMany('Tag'),在我的Tags 模型中,我有belongsToMany('Image')。到目前为止,这一切都如我所愿。
但是,当我尝试通过它们的标签搜索图像时,我的问题就出现了。我似乎可以使用以下代码进行或搜索。
$tags = explode(' ', $tag_text);
$query = DB::table('images');
$query->join('image_tag', 'images.id', '=', 'image_tag.image_id');
$query->join('tags', 'tags.id', '=', 'image_tag.tag_id');
foreach ($tags as $tag)
{
$query->orWhere('tags.name', '=', $tag);
}
$result = $query->get();
如果我搜索(例如)nyc skyscraper,我会得到一个带有标签 nyc 或标签 skyscraper 的图像列表。但是,我只想显示带有标签 nyc 和标签 skyscraper 的图像。
我尝试将$query->orWhere('tags.name', '=', $tag); 更改为$query->where('tags.name', '=', $tag);,但这并没有返回任何结果(可能是因为它弄乱了标签名称搜索)。查询 Laravel 正在运行 "select * from 'images' inner join 'image_tag' on 'images'.'id' = 'image_tag'.'image_id' inner join 'tags' on 'tags'.'id' = 'image_tag'.'tag_id' where 'tags'.'name' = ? and 'tags'.'name' = ?",绑定 nyc 和 skyscraper。
我想知道是否单独为每个标签进行图像搜索(在上面的示例中,它将返回带有标签 nyc 的图像,然后返回带有标签 skyscraper 的图像),然后挑选出两个结果中出现的图像,但我不确定实现它的最佳方法是什么,以及它是否是最有效的方法。
我怀疑有一种简单的方法可以使用我目前缺少的查询生成器来执行此操作!
使它更复杂一点(并且目前不起作用)的是,除了标签搜索之外,我还想显示具有(例如)一定宽度的图像。所以在标签代码之后,我已经包含了
$query->where('image_width', '>', 1000);
它返回所有宽度超过 1000 像素的图像,但仅当我不包含标签搜索代码时。如果我确实包含了标签搜索代码,它会忽略搜索的图像宽度部分。
因此,理想情况下,我想返回标记为 nyc 和标记为 skyscraper 并且 宽度超过 1000 像素 的图像>.
【问题讨论】:
-
我认为您与
$query->where('tags.name', '=', $tag);关系密切。运行完成后您可以执行的操作是echo $query->toSql();,它应该向您显示它正在尝试运行的 SQL,它会让您更好地了解它的问题所在。 -
谢谢——我知道我忘了包括一些东西。我现在已经添加了查询。
-
现在我看到了查询,我可以很明显地看到为什么它不起作用。看来我们需要更有创意了,等我搞定后我会发布答案。
标签: join laravel laravel-4 eloquent query-builder