如何获取项目不在 Laravel Eloquent 的集合中?

在我的 Laravel 6.x 项目中,我有Product模型Warehouse和WarehouseProduct模型。


在产品中,我存储了我产品的基本信息。在 WarehouseProduct 中,我存储有关仓库中产品的库存量信息。当然,我有很多仓库,里面有很多产品。


我的Product样子是这样的:


class Product extends Model

{

    protected $fillable = [

        'name',

        'item_number',

        // ...

    ];

}

看起来Warehouse像这样:


class Warehouse extends Model

{

    protected $fillable = [

        'name',

        'address',

        // ...

    ];


    public function products() {

        return $this->hasMany(WarehouseProduct::class);

    }


    public function missingProduct() {

        // here I need to return a Product collection which are not in this Warehouse or the

        // stored amount is 0

    }

}

最后WarehouseProduct看起来像这样:


class WarehouseProduct extends Model

{

    protected $fillable = [

        'product_id',

        'warehouse_id',

        'amount',

        // ...

    ];


    public function product() {

        return $this->belongsTo(Product::class, 'product_id');

    }


    public function warehouse() {

        return $this->belongsTo(Warehouse::class, 'warehouse_id');

    }

我怎样才能得到一个Product没有存储在 aWarehouse或数量是的集合0?


偶然的你
浏览 88回答 2
2回答

慕田峪9158850

这样的事情应该有效:use App\Product;public function missingProduct() {    $excludedProducts = $this->products()->where('amount', '>', 0)->pluck('id');    return Product::whereNotIn('id', $excludedProducts)->get();}基于@KarolSobański 的解决方案,当您warehouse_products向产品模型添加关系时:use App\Product;use Illuminate\Database\Eloquent\Builder;public function missingProduct() {    return Product::whereDoesntHave('warehouse_products', function (Builder $query) {        $query->where('warehouse_id', $this->id);    })->orWhereHas('warehouse_products', function (Builder $query) {        $query->where('warehouse_id', $this->id);        $query->where('amount', 0);    })->get();}

料青山看我应如是

最短的答案可能与此类似:Product::doesntHave('warehouse_products')       ->orWhereHas('warehouse_products', function (Builder $query) {           $query->where('amount', '=', 0)       })->get();虽然我不确定以上是否有效。但以下较长的查询肯定可以解决问题:Product::where(function ($query) {    $query->doesntHave('warehouse_products');})->orWhere(function ($query) {    $query->whereHas('warehouse_products', function (Builder $query) {       $query->where('amount', '=', 0);    });})->get();
打开App,查看更多内容
随时随地看视频慕课网APP