我正在尝试根据用户提交的标记数返回一个具有任意数量的where子句的查询。
//unknown number of ids to query on
$tag_ids = array(1,5);
//multiple joins with closure
$items = DB::table('archives_items_metadata')->join('tags', 'archives_items_metadata.tag_id', '=', 'tags.id')->join('archives_items', 'archives_items_metadata.archive_item_id', '=', 'archives_items.id')->join('items', 'archives_items.item_id', '=', 'items.id')
->where(function ($query) use ($tag_ids) {
foreach ($tag_ids as $tag_id)
{
$query->where('archives_items_metadata.tag_id', $tag_id);
}
})->get();
我得到的结果是一个空数组,即使我自己尝试array(1)或array(5),它们都返回相同的项目。我错过了什么?
EDIT :: 我希望返回指定了每个标记ID的项目。项目对标签的引用存储在archives_items_metadata表中。我怎样才能得到我期望的结果,以及实现这一目标的最有效方法是什么?
答案 0 :(得分:1)
您希望WHERE tag_id IN (1, 2, 3)
样式子句laravel
具有whereIn($col, $vals)
构建器功能。
->whereIn('archives_items_metadata.tag_id', $tag_ids)
答案 1 :(得分:0)
$tag_count = count($tag_ids);
$items = DB::table('archives_items')->join('archives_items_metadata', 'archives_items_metadata.archive_item_id', '=', 'archives_items.id')->join('tags', 'archives_items_metadata.tag_id', '=', 'tags.id')
->whereIn('archives_items_metadata.tag_id', $tag_ids)->whereNull('archives_items_metadata.deleted_at')
->groupBy('archives_items_metadata.archive_item_id')->havingRaw('count(*)='.$tag_count->get();