我有两个模型
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()
似乎都工作得很好。我不知道我在这里做错了什么。
看起来您已经正确设置了关系,但急切加载可能存在问题。默认情况下,除非您明确请求关系,否则不会加载关系。当你使用 ->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 的问题。