Laravel在查询生成器中使用UNION


Laravel using UNION in query builder

我有一个工作正常的SQL查询,我正在尝试转换为流利的::

SELECT DISTINCT tags.tag
  FROM tags, items
  WHERE tags.taggable_type = 'Item'
  AND items.item_list_id = '1'
UNION
SELECT DISTINCT tags.tag
  FROM tags, itemlists
  WHERE tags.taggable_type = 'ItemList'
  AND itemlists.id = '1'

这就是我到目前为止流利的,据我从文档和各个查询中可以看出,这一切似乎都是正确的,它们都可以自行工作,只是当我将它们联合起来时,它会抛出错误:

   $itemTags = Tag::join('items', 'items.id', '=', 'tags.taggable_id')
                ->select('tags.tag')
                ->distinct()
                ->where('tags.taggable_type', '=', 'Item')
                ->where('items.item_list_id', '=', $itemList->id);
    $itemListTags = Tag::join('itemlists', 'itemlists.id', '=', 'tags.taggable_id')
                ->select('tags.tag')
                ->distinct()
                ->where('tags.taggable_type', '=', 'ItemList')
                ->where('itemlists.id', '=', $itemList->id);
// the var_dump below shows the expected results for the individual queries
// var_dump($itemTags->lists('tag'), $itemListTags->lists('tag')); exit;
    return      $itemTags
                ->union($itemListTags)
                ->get();

当我运行它时,我收到以下错误(我还在模型上从 Ardent 换回 Eloquent 以防万一有所作为 - 它没有):

Argument 1 passed to Illuminate'Database'Query'Builder::mergeBindings() must be an instance of Illuminate'Database'Query'Builder, instance of LaravelBook'Ardent'Builder given, called in path/to/root'vendor'laravel'framework'src'Illuminate'Database'Query'Builder.php on line 898 and defined 

看起来您的模型使用的是 Ardent,而不是 Eloquent:

...instance of LaravelBook'Ardent'Builder given, ...

也许这可能是Ardent的问题,而不是Laravel。

在此处打开问题:https://github.com/laravelbook/ardent。

编辑:

尝试更改使用 QueryBuilder 而不是 Eloquent:

将它用于 QueryBuilder:

DB::table('tags')->

而不是雄辩的方式:

Tag::

我知道你提到想要使用查询生成器,但对于构建器可能抛出的复杂查询,您可以直接访问 PDO 对象:

$pdo = DB::connection()->getPdo();