Laravel在查询构建器中使用UNION

时间:2013-09-27 12:07:06

标签: php sql laravel laravel-4 eloquent

我有一个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 

2 个答案:

答案 0 :(得分:4)

看起来你的模特正在使用Ardent,而不是Eloquent:

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

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

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

编辑:

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

将此用于QueryBuilder:

DB::table('tags')->

而不是雄辩的方式:

Tag::

答案 1 :(得分:1)

我知道您曾提到过要使用查询构建器,但对于构​​建器可能适合的复杂查询,您可以直接访问PDO对象:

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