Php 试图用Laravel雄辩地描述相关的表、列和和和
嗯。 我有三张桌子Php 试图用Laravel雄辩地描述相关的表、列和和和,php,laravel,eloquent,Php,Laravel,Eloquent,嗯。 我有三张桌子 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 产品放在不同的仓库里,所
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');
}
}
我想得到的是products中的所有列,productType中的product type name,ProductQuantilities中的数量之和,因此我可以稍后使用where()对这些列值执行搜索
我怎样才能得到这些有说服力的专栏
我知道我可以用原始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);
我认为任何类型的连接方法似乎都不能很好地处理雄辩的关系?但是旧的方法也有leftjoin方法。我还没有测试过这一点(我假设您想在产品类型\u名称上分组),但您应该能够按照以下方式进行操作:
$results = Product::with(['productType','productQuantities'])
->select(DB::raw('products.*,
productType.product_type_name,
sum(productQuantities.quantity) as "QuantitySum"'))
->groupBy('productType.product_type_name')
->get();
或
然后,您应该能够使用(在循环中,如果您愿意)访问聚合数量$results->QuantitySum
您可以使用和来获得它。例如,您需要查询产品类型名称为“new product”且数量大于1000的产品:
Product::with("productType")
->whereHas("productType", function ($query) {
$query->where("product_type_name", "like", "new product");
})
->withCount(["productQuantities as quantity_count" => function ($query) {
$query->selectRaw("sum(quantity)");
}])
->having("quantity_count", ">", 1000)
->get();
你们可以度过这段感情
$product->productType->product_type_name
和属性:
$product->quantity_count
给了我想要的结果,但没有破坏其他部分
但是我仍然不明白为什么with()和withSum()不能一起工作。
是因为products
属于productTypes
也许当你说你可以使用“原始sql命令”时,你的意思是你不想使用雄辩的select(DB::raw())
命令吗?@Andrew oh我没有试过select(DB::raw()),但我试过用leftjoin()选择raw()但是ProductQuantilities collection不知何故停止了获取像这样的地方的数据。foreach($products->productQuantilities as pq)pq->quantity EndForEach查看我下面的答案是否有用,如果它对您不起作用,则将您尝试的查询添加到您的问题中会有帮助。给了我未找到的列错误。产品\u类型\u名称不正确found@BaljinnyamOlkhonud我修改了我的答案,让我知道它是否适合你。然后我的页面的所有其他部分都停止工作。我避免了是这样的,所以我不会弄乱他们。我不能从eloquent的模型关系中得到任何东西。你有任何错误吗?我再次更新了代码,我错过了()
我第一次声明。我需要的是sum而不是count tho。我可以用与withCount相同的方法更改列名称吗?您使用的是哪种laravel版本?我更改withCount回调以对数量进行求和,在laravel 8中,您可以用sum('ProductQuantity','quantity'替换它)
$product->quantity_count
$products = Product::withsum('productQuantities','quantity')
->leftjoin('product_types','products.product_type_id','=','product_types.product_type_id')