为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
偶然的你 2023-04-02 10:39:08
在我的 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?
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这样的事情应该有效:


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();

}


查看完整回答
反对 回复 2023-04-02
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

最短的答案可能与此类似:


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();


查看完整回答
反对 回复 2023-04-02
  • 2 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信