我有一个 Eloquent 模型,我想为特定模型创建一些快捷功能,比如可能User::tall()
代替编写User::where("height", ">", 185)
. 但我希望它们既是静态方法又是非静态方法,这样我也可以调用$user->where('is_active', '=', '1')->tall()
.
有没有办法我可以做到这一点?我可以看到 Laravel 以某种方式设法做到了这一点,因为可以从两个上下文中调用 where 。我查看了代码,但我只能找到一个对象方法。
我有一个 Eloquent 模型,我想为特定模型创建一些快捷功能,比如可能User::tall()
代替编写User::where("height", ">", 185)
. 但我希望它们既是静态方法又是非静态方法,这样我也可以调用$user->where('is_active', '=', '1')->tall()
.
有没有办法我可以做到这一点?我可以看到 Laravel 以某种方式设法做到了这一点,因为可以从两个上下文中调用 where 。我查看了代码,但我只能找到一个对象方法。
我认为查询范围是您正在寻找的:http: //laravel.com/docs/eloquent#query-scopes
public function scopeTall($query)
{
return $query->where('height', '>', 185);
}
您还可以为查询范围指定参数,例如:
public function scopeTall($query, $height = 185)
{
return $query->where('height', '>', $height);
}
范围查询是可链接的。
只需在您的用户类上编写一个新的静态方法
class User extends Eloquent {
public static function tall() {
return User::where("height", ">", 185);
}
}
然后在别处访问
$users = User::tall()->get();
如果您确保不将该->get()
调用包含在您的方法中,而是在您调用该方法时包含它(如上所述),那么由于返回查询构建器,您应该能够在调用之前向其添加其他 where 语句get()
$users = User::tall()->where("is_active", "=", 1)->get();
你试过这样的东西吗?
class YourClassModel extends Eloquent
{
public static function tall()
{
// Return the result of your query
return ...;
}
}