php 如何检查Laravel eloquest关系在模型的检索事件上是否为eagerLoaded?

tf7tbtn2  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(123)

我将尽可能地把问题简化。
我想禁用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;
    }
}

有没有人遇到过类似的情况,可以给我一些帮助?

jyztefdp

jyztefdp1#

有一个名为relationLoaded的方法返回一个布尔值。看起来很适合你的需要。
或者,如果您希望加载尚未加载的关系,则可以使用loadMissing

$post = Post::first();
$post->relationLoaded('comments'); // false
$post->loadMissing('comments');    // makes the queries to load the relationship
$post->relationLoaded('comments'); // true
$post->loadMissing('comments');    // does nothing. comments is already loaded

相关问题