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')