我正试图在我的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)
时仍然会产生类似的问题。
非常感谢任何帮助。
在这里使用特质会被认为是一个不好的选择吗?
答案 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 {
}