【发布时间】:2021-07-28 08:25:42
【问题描述】:
好的。 我有三张桌子
products
--product_id
--product_name
--product_type_id
--price15
--price23
--description
--bonus_points
--image
productTypes
--product_type_id
--product_type_name
productQuantities
--id
--product_id
--warehouse_id
--quantity
产品被放置在不同的仓库,所以我必须记录它的数量
和有关系是这样的
class Product extends Model
{
public function productType() {
return $this->belongsTo('App\Models\ProductType','product_type_id','product_type_id');
}
public function productQuantities() {
return $this->hasMany('App\Models\ProductQuantity','product_id','product_id');
}
}
我想要得到的是productType 中的所有列和productType 中的产品类型名称,productQuantities 中的数量总和,因此我可以稍后使用where() 对这些列值执行搜索。
如何使用 Eloquent 获取这些列?
我知道我可以使用原始 SQL 命令获取它们,但出于兼容性原因我需要这样做。 在我问这个问题之前,我尝试过这种方式。 但是模型关系刚刚停止工作,没有错误。页面其他部分的值刚刚被清空。
$products = Product::selectRaw('products.*, productTypes.product_type_name, sum(product_quantities.quantity) as quantitySum')
->leftjoin('productTypes','products.product_type_id','=','productTypes.product_type_id')
->leftjoin('productQuantities','products.product_id','=','productQuantities.product_id')
->where('products.product_id','like','%'.$searchID.'%')
->where('product_name', 'like', '%'.$searchName.'%')
->where('product_type_name', 'like', '%'.$searchType.'%')
->where(function($q) use ($searchPrice) {
$q->where('price15','like','%'.$searchPrice.'%')
->orwhere('price23','like','%'.$searchPrice.'%');
})
->where('points', 'like', '%'.$searchPoints.'%')
->groupBy('products.product_id')
->orderByRaw($query)
->paginate($paginateBy);
在此之前的工作版本很简单。
Product::leftjoin('productTypes','products.product_type_id','=','productTypes.product_type_id')
->select('products.*','productTypes.product_type_name')
->where('products.product_id','like','%'.$searchID.'%')
->where('product_name', 'like', '%'.$searchName.'%')
->where('product_type_name', 'like', '%'.$searchType.'%')
->where(function($q) use ($searchPrice) {
$q->where('price15','like','%'.$searchPrice.'%')
->orwhere('price23','like','%'.$searchPrice.'%');
})
->where('points', 'like', '%'.$searchPoints.'%')
->orderByRaw($query)
->paginate($paginateBy);
我认为任何类型的连接方法似乎都不适用于 Eloquent 关系?但旧的也有 leftjoin 方法。
【问题讨论】:
-
当你说你可以使用“原始sql命令”时,你的意思是你不想使用一个雄辩的
select(DB::raw())命令? -
@Andrew 哦,我没有尝试 select(DB::raw()),但我确实尝试了 selectRaw() 和 leftjoin()。但是 productQuantities 集合不知何故停止了获取此类地方的数据。 foreach($products->productQuantities as pq) pq->quantity endforeach
-
看看我下面的回答是否有帮助,如果它对您不起作用,那么将您尝试过的查询添加到您的问题中会有所帮助。