Laravel Join Query 获取所有匹配的记录

Posted

技术标签:

【中文标题】Laravel Join Query 获取所有匹配的记录【英文标题】:Laravel Join Query to get all matching records 【发布时间】:2022-01-04 09:50:41 【问题描述】:

我想使用连接中的子查询获取给定产品 ID 的所有产品属性(如果有)。

以下是我的查询

 $product_attributes = ProductAttributes::select('name as attribute_name', 'value as attribute_value')->get();

 $data['product']= Product::select('products.*','vendors.name as vendor_name','product_discounts.start_time',
            'product_discounts.end_time', 'product_discounts.discount_type','product_discounts.discount_value','product_attributes.name','product_attributes.value')
            ->leftjoin('product_discounts','products.id','=','product_discounts.product_id')
            ->joinSub($product_attributes, 'product_attributes', function ($join) 
                $join->on('products.id', '=', 'product_attributes.product_id');
            )->leftjoin('vendors','products.vendor_id','=','vendors.id')->where('id',$request->product_id)->first(); 

这个查询给了我以下错误

InvalidArgumentException 子查询必须是查询构建器实例, 闭包或字符串。

如果我使用简单的 leftjoin 和产品属性,它会给我 product_attributes 表中的最后一项。

有人可以指导我如何在没有循环的情况下针对产品列出所有产品属性。下面是产品属性表

【问题讨论】:

你有没有使用 Eloquent 建立过模型关系? @party-ring 不,我没有,你能指导我如何在这种情况下使用关系 【参考方案1】:

使用 ->get() 代替 ->first();

【讨论】:

这有什么帮助?请详细说明 ->first();方法返回一条记录,get() 将返回所有匹配的记录 示例:$orderList = DB::table('users') ->join('orders', 'users.id', '=', 'orders.user_id') ->join( 'order_items', 'orders.id', '=', 'order_items.orders_id') ->where('users.id', '=', 5) ->get();

以上是关于Laravel Join Query 获取所有匹配的记录的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Join 返回奇数

在 Laravel Query Builder 中根据他们的技能以及匹配的技能选择用户

Laravel Eloquent 匹配连接的所有参数

MySQL Query Join 从两个表中选择不匹配的行

Laravel - 使用 Join 语句更新表中的所有列

如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?