首页 > 解决方案 > 如何在 Laravel 8 中获取扩展类的第一个对象

问题描述

我有一个类 Person,它在数据库中的表称为 people。我将 Person 类扩展为两个不同的类:Client 和 Employee。两者在程序中执行的动作不同,但基本上都是由一列 persontype_id 的值定义的(当然还有一个模型 PersonType)。

我可以做这样的事情:

$clients = Client::where( 'persontype_id', 1 )->get(); // because PersonType = 1 means clients

但是有没有办法为整个模型确定范围,所以我可以做这样的事情:

$client = Client::all(); // and I get only clients without Employees?

类似于 SoftDeletes 特征的东西,在执行查询时会忽略已删除的对象

标签: eloquentlaravel-8

解决方案


好的,我找到了 Caleb Porzio 的一篇文章https://tighten.co/blog/extending-models-in-eloquent/,他展示了如何使用静态列类型进行操作。他甚至有一个包裹。我的解决方案将关系添加到全局范围(personTypes),方法如下所示:

public static function boot()
{
    parent::boot();

    static::addGlobalScope(function ($query) {
        $query->whereHas('personTypes', function ($query) {
            return $query->where('slug', 'client' );
        });
    });
}

推荐阅读