多态多对多关系模型属性不返回集合,但 ->get() 会返回集合

问题描述 投票:0回答:1

我有两个模型

Product
ProductType
,它们都与
Usp
模型有关系。我已经建立了这样的模型。

class Product extends Model
{
    use HasFactory, SoftDeletes;

    protected $guarded = [];

    public function usps(): MorphToMany
    {
        return $this->morphToMany(Usp::class, 'uspable');
    }
}


class ProductType extends Model
{
    use HasFactory, SoftDeletes;

    protected $guarded = [];

    public function usps(): MorphToMany
    {
        return $this->morphToMany(Usp::class, 'uspable');
    }
}

class Usp extends Model
{
    use HasFactory, SoftDeletes;

    protected $guarded = [];

    public function products(): MorphToMany
    {
        return $this->morphedByMany(Product::class, 'uspable');
    }

    public function productTypes(): MorphToMany
    {
        return $this->morphedByMany(ProductType::class, 'uspable');
    }
}

据我所知,我已经正确设置了所有内容,但由于某些奇怪的原因,当我调用

ProductType
模型的属性时,它返回
null
(即
ProductType::find(1)->usps
)。但是当我调用查询生成器方法
ProductType::find(1)->usps()->get()
时,它给了我正确的结果。对于产品模型
->usps
->usps()->get()
似乎都工作得很好。我不知道我在这里做错了什么。

php laravel polymorphism
1个回答
0
投票

看起来您已经正确设置了关系,但急切加载可能存在问题。默认情况下,除非您明确请求关系,否则不会加载关系。当你使用 ->usps 时,它可能不会急切加载关系,导致 null。但是,当您使用 ->usps()->get() 时,您显式触发了关系的加载。

为了确保直接访问关系时加载关系,可以使用 with 方法进行预加载。尝试按如下方式修改您的代码:

$productType = ProductType::with('usps')->find(1);
$usps = $productType->usps; // This should now work as expected

通过使用 with('usps'),您指示 Laravel 立即加载“usps”关系以及“ProductType”模型,然后您可以直接访问它,而无需调用 ->usps()->get( ).

或者,您可以在检索 ProductType 实例后使用 load 方法:

$productType = ProductType::find(1);
$productType->load('usps');
$usps = $productType->usps; // This should now work as expected

这应该可以解决直接在 ProductType 模型上访问 usps 关系时返回 null 的问题。

© www.soinside.com 2019 - 2024. All rights reserved.