在Laravel中将范围添加到父模型

时间:2017-05-31 07:03:51

标签: php laravel

我正试图在我的Laravel模型中清理我的代码,此刻我在每个模型中都有很多与本地范围重复的代码。每个模型都有很多相似的列,我正在弄清楚如何将这些范围放在一个地方,但仍然能够传递$table变量,以便动态使用它。

我目前在一些模型中有例如

public function scopeName($query, $name)
{
    return $query->where($this->table.'name', $name);
}

public function scopeStatus($query, $status)
{
    return $query->where($this->table.'.status', $status);
}

我想把这些常见的范围放在一个类中,我可以将表传递给它,然后我可以消除代码重复。 Haven能够找到与扩展父模型类似的任何东西。我也知道全局范围,但是在我在每个模型中键入static::addGlobalScope(new StatusScope)时仍然会产生类似的问题。

非常感谢任何帮助。

在这里使用特质会被认为是一个不好的选择吗?

2 个答案:

答案 0 :(得分:6)

Trait在这里比继承更好,阅读更多:https://en.wikipedia.org/wiki/Composition_over_inheritance

您可以为它创建一个新特征:

trait CommonScopesTrait
{
    public function scopeName($query, $name)
    {
        return $query->where($this->table.'name', $name);
    }

    public function scopeStatus($query, $status)
    {
        return $query->where($this->table.'.status', $status);
    }
}

并在您的模型中使用它:

class YourModel extends Model
{
    use CommonScopesTrait;
}

答案 1 :(得分:3)

lptn的答案外,还有另一种选择,也很不错。

创建一个扩展为Eloquent的基本模型:

class BasicScope extends Eloquent {
    public function scopeName($query, $name)
    {
        return $query->where($this->table.'name', $name);
    }

    public function scopeStatus($query, $status)
    {
        return $query->where($this->table.'.status', $status);
    }
}

然后在BasicScope模型上扩展您自己的模型,这样您就可以使用这些方法:

class User extends BasicScope {

}