我将尽可能地把问题简化。
我想禁用retrieved
事件中发生的资源trait的关系加载。
有一个模型我们命名为Post
,它使用了一个名为HasComments
的特征。
class Post extends Model
{
use HasComments;
...
}
trait侦听模型上的retrieved
事件,并加载comments
关系。
trait HasComment
{
public static function bootHasComment(): void
{
self::retrieved(function ($model) {
$model->load('comments');
});
}
public function comments(): BelongsTo
{
return $this->belongsTo(Comment::class);
}
}
我希望能够检查comments
关系是否已立即加载,并且不再加载该关系。
我尝试检查是否加载了关系,但失败了。
例如:
self::retrieved(function ($model) {
if (!isset($model->relations['comments'])) {
dd('still loads!');
$model->load('comments');
}
});
或
self::retrieved(function ($model) {
if (!$model->relationLoaded('comments')) {
dd('still loads!');
$model->load('comments');
}
});
我还在想,也许有一种方法可以在构造查询时禁用此行为,但再次失败。
例如:
trait HasComment
{
public bool $load = true;
public static function bootHasComment(): void
{
self::retrieved(function ($model) {
if (!$this->load) {
dd('still loads!');
$model->load('comments');
}
});
}
public function comments(): BelongsTo
{
return $this->belongsTo(Comment::class);
}
public function disableRetrievedLoad()
{
$this->load = false;
}
}
有没有人遇到过类似的情况,可以给我一些帮助?
1条答案
按热度按时间jyztefdp1#
有一个名为
relationLoaded
的方法返回一个布尔值。看起来很适合你的需要。或者,如果您希望加载尚未加载的关系,则可以使用
loadMissing
。