Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 将原始SQL转换为使用雄辩的查询生成器_Laravel_Laravel 5 - Fatal编程技术网

Laravel 将原始SQL转换为使用雄辩的查询生成器

Laravel 将原始SQL转换为使用雄辩的查询生成器,laravel,laravel-5,Laravel,Laravel 5,如何将以下复杂的SQL查询转换为使用雄辩的查询生成器?我想使用join、where、get等方法 下面的查询返回位置列表以及已兑换凭证的计数 选择 a、 地点和名称, 作为日期, a、 地方,, sumnetvalue155, sumnetvalue135来自 选择 l、 身份证, l、 地点和名称, b、 地方,, 当v.net_值=155时,则1或0结束为netvalue155, 当v.net_值=135时,则1或0结束为netvalue135 从地点l l.id=b.location\U

如何将以下复杂的SQL查询转换为使用雄辩的查询生成器?我想使用join、where、get等方法

下面的查询返回位置列表以及已兑换凭证的计数

选择 a、 地点和名称, 作为日期, a、 地方,, sumnetvalue155, sumnetvalue135来自 选择 l、 身份证, l、 地点和名称, b、 地方,, 当v.net_值=155时,则1或0结束为netvalue155, 当v.net_值=135时,则1或0结束为netvalue135 从地点l l.id=b.location\U id上的左联合预订b 左键连接b上的凭证v。凭证\代码=v。凭证\代码 A. l.id=a.id上的右连接位置l 按a.location\u名称分组 编辑

我正在尝试下面的代码,它抛出了错误SQLSTATE[42S22]:Column not found:1054 on子句中的未知列'sub.id'

首先 我经常看到人们询问如何在Laravels query Builder中重建复杂的SQL查询。但并非SQL或MySQL中可能的所有操作都在Laravels查询生成器中作为函数实现。这意味着如果不使用原始SQL,就无法在查询生成器中重建每个SQL查询

这对SQL查询意味着什么? 一些事情,如从选择子查询。。。当…时的部分和情况。。。零件未在查询生成器中实现。因此,至少您必须将原始表达式与DB::raw函数一起使用。我不确定这是否可能,但你肯定会在文件中找到

连接等其他功能作为函数实现:

$users=DB::表“用户” ->加入'contacts','users.id','=','contacts.user\u id' ->加入'orders','users.id','=','orders.user\u id' ->选择“users.id”、“contacts.phone”、“orders.price” ->得到; 参见Laravel文档:

您甚至可以将查询生成器函数与原始表达式混合使用:

$users=DB::表“用户” ->选择数据库::原始“计数*作为用户计数,状态” ->“状态”在哪里,1 ->groupBy“状态” ->得到; 参见Laravel文档:

子查询的示例:

$subQuery=DB::表“位置” ->leftJoin'bookings'、'locations.id'、'='、'bookings.location\u id' ->leftJoin“凭单”、“预订.凭单\u代码”、“凭单=”、“凭单.凭单\u代码” ->选择'locations.id'、'locations.location_name'、'bookings.places'; $query=DB::tableDB::raw{$subQuery->toSql}as sub ->合并绑定$subQuery ->选择。。。 ->右键连接。。。 ->groupBy'sub.location\u name' ->得到; 因此,您可以在查询生成器中重建查询的某些部分,并在需要时使用原始表达式


在构建Laravels函数时调试查询非常有用。

您必须使用DB::raw作为case语句-Eloquent不支持这一点。查询的其余部分是可行的,尽管我不知道如何从第一部分开始求和。你能给我们一些基础吗?还有几句关于你想得到什么的话?首先,我将把这些查询分成两部分seperate@amir我在我的帖子中添加了一个简短的描述,描述了查询的作用。但是,我不知道你还需要什么信息。我只想使用Laravel-5雄辩的构建器来重建这个查询,以便在需要时可以轻松地添加新的where语句。我希望这能有所帮助。谢谢你,但它并没有真正解释我如何实现子查询。我是否要添加另一个包含子查询的->选择?如果是这样,我应该在哪里添加它?我添加了一个子查询的示例,但仍然为您留下了一些工作;我已经用我正在使用的代码更新了我的问题。但是它给了我一个未知的列错误。不知道如何解决这个问题?我想你也必须在这里使用原始语句来求和,就像你在part中所做的那样。你知道是否可以添加另一个子查询吗。我已经用我正在使用的最新Laravel代码更新了我的问题,但是我得到了未知列错误。但是,如果我删除meatBookQuery的第二个子查询,它就会工作。有什么想法吗@佩赫
$subQuery = DB::table('locations')
        ->select(
            'locations.id',
            'locations.location_name',
            DB::raw('"'.$request->get('dates').'" as dates'),
            DB::raw('sum(bookings.id) as number'),
            DB::raw('round(sum(bookings.final_price/1.2), 2) as paidbycard'),
            DB::raw('case when bookings.voucher_value = 155 then round(sum(bookings.voucher_value/1.2), 2) else 0.00 end as voucher155'),
            DB::raw('case when bookings.voucher_value = 135 then round(sum(bookings.voucher_value/1.2), 2) else 0.00 end as voucher135'),
            DB::raw('case when bookings.transfer_fee = 10 then round(sum(bookings.transfer_fee/1.2), 2) else 0.00 end as transfer_fee'))
        ->leftJoin('bookings', 'locations.id', '=', 'bookings.location_id');

    $meatBookQuery = DB::table('orders')->select(DB::raw('sum(orders_items.price) as total'))
        ->join('orders_items', 'orders.id', '=', 'orders_items.order_id')
        ->where('orders_items.item_name', 'The Meat Book');

    $booking = DB::table(DB::raw("({$subQuery->toSql()}) as sub, ({$meatBookQuery->toSql()}) as meatBook"))
        ->mergeBindings($subQuery)
        ->mergeBindings($meatBookQuery)
        ->select('sub.location_name', 'sub.dates', 'sub.number', 'sub.paidbycard', 'sub.voucher155', 'sub.voucher135', 'sub.transfer_fee', DB::raw('round(sum(sub.voucher155 + sub.voucher135 + sub.transfer_fee + sub.paidbycard), 2) as total'), 'meatBook.total')
        ->leftJoin('locations', 'locations.id', '=', 'sub.id')
        ->leftJoin('bookings', 'bookings.location_id', '=', 'sub.id')
        ->groupBy('sub.location_name');