有没有办法在使用 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 并且我无法访问我当前的模型属性。
你有什么解决办法吗?
一样定义范围
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()
大家好,我有个问题。 我试图通过定义一个范围来预先加载我的购物车项目:
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 并且我无法访问我当前的模型属性。 你有什么解决办法吗?
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()