【问题标题】:Laravel using UNION in query builderLaravel 在查询构建器中使用 UNION
【发布时间】:2013-10-03 17:29:42
【问题描述】:

我有一个运行良好的 SQL 查询,我正在尝试转换为 fluent::

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 

【问题讨论】:

    标签: php sql laravel laravel-4 eloquent


    【解决方案1】:

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

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

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

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

    编辑:

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

    将此用于 QueryBuilder:

    DB::table('tags')->
    

    而不是雄辩的方式:

    Tag::
    

    【讨论】:

    • 嗨,我已经尝试设置所有三个模型来扩展 Eloquent 而不是 Ardent 我收到类似的错误:Argument 1 passed to Illuminate\Database\Query\Builder::mergeBindings() must be an instance of Illuminate\Database\Query\Builder, instance of Illuminate\Database\Eloquent\Builder given, called in E:\docs\Documents\Work\MGC\mgc_root\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php on line 898 and defined
    • 你使用的是 Laravel 4.0 还是 4.1?
    • 4.0 我相信,我会尝试运行作曲家更新,看看是否有帮助
    • 已编辑,可以使用 QueryBuilder。但这看起来像是 Laravel 上的一个错误。
    • 我在 4.0 上,composer.json 文件有:"laravel/framework": "4.0.*",,我已经运行了 composer 更新。我想我会提交一个错误报告,谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2020-03-15
      • 2018-07-03
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多