Laravel:对于每个where子句

时间:2014-07-04 22:04:16

标签: php mysql laravel-4

我正在尝试根据用户提交的标记数返回一个具有任意数量的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表中。我怎样才能得到我期望的结果,以及实现这一目标的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

您希望WHERE tag_id IN (1, 2, 3)样式子句laravel具有whereIn($col, $vals)构建器功能。

->whereIn('archives_items_metadata.tag_id', $tag_ids)

search for "whereIn" in the official docs

答案 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();