有没有办法在使用 with 方法时访问模型属性

is there a way to access model attributes while using with method

大家好,我有个问题。 我试图通过定义一个范围来预先加载我的购物车项目:

public function apply(Builder $builder, Model $model)
{
    $builder->with(['product']);
}

我在篮子模型中的产品关系如下:

public function product()
{
    if ($this->used_product_id) {
        return $this->belongsTo(UsedProduct::class, 'used_product_id', 'id');
    } else {
        return $this->belongsTo(Product::class, 'product_id', 'id');
    }
}

但问题是使用 with() $this->used_product_id returns null 并且我无法访问我当前的模型属性。 你有什么解决办法吗?

您可以像 anonymous global scope

一样定义范围
class Basket extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('withProduct', function (Builder $builder) {
            $builder->with('product');
        });
    }

    public function product()
    {
        if ($this->used_product_id) {
            return $this->belongsTo(UsedProduct::class, 'used_product_id', 'id');
        } else {
            return $this->belongsTo(Product::class, 'product_id', 'id');
        }
    }
}

或使用 $with 属性.

class Basket extends Model
{
    /**
     * The relations to eager load on every query.
     *
     * @var array
     */
    protected $with = ['product'];

    public function product()
    {
        if ($this->used_product_id) {
            return $this->belongsTo(UsedProduct::class, 'used_product_id', 'id');
        } else {
            return $this->belongsTo(Product::class, 'product_id', 'id');
        }
    }
}

我会尝试这样的事情:

class Basket extends Model
{

    public function newProduct()
    {
        return $this->belongsTo(Product::class, 'product_id', 'id');
    }

    public function usedProduct()
    {
        return $this->belongsTo(UsedProduct::class, 'used_product_id', 'id');
    }

    public function product()
    {
        return $this->usedProduct ?? $this->newProduct ?? null;
    }

}

为确保预加载产品,您必须同时加载这两种产品,例如

Basket::with(['newProduct','usedProduct'])->get()