使用 Laravel 关系调用模型方法
Call a Model method using Laravel Relationship
我目前正在尝试使用 Laravel 关系来使用用户模型访问我的成就模型,我使用此关系代码:
public function achievements()
{
return $this->hasMany('App\Models\User\Achievement');
}
我可以轻松地进行一些 eloquent 查询,但是我无法访问我在那里创建的任何方法,我无法访问此方法:
class Achievement extends Model
{
public function achievementsAvailableToClaim(): int
{
// Not an eloquent query
}
}
使用以下代码:
Auth::user()->achievements()->achievementsAvailableToClaim();
我认为我以错误的方式使用了这个 Laravel 函数,因此我在不使用关系的情况下尝试了其他方法:
public function achievements()
{
return new \App\Models\User\Achievement;
}
但这会带来性能问题,因为每次我在用户模型中使用成就函数时都会创建一个新的 class 实例吗?
我正在尝试做的事情的正确方法是什么?
您可以使用 laravel scopes。与局部作用域一样,您可以定义通用约束集,您可以在整个应用程序中轻松 re-use。
在您的情况下,您可以这样使用,在模型中定义范围:
public function scopeAchievementsAvailableToClaim()
{
return $query->where('achivement_avilable', true);
}
你可以这样使用:
Auth::user()->achievements()->achievementsAvailableToClaim();
它不起作用,因为您的 eloquent 关系是一个 hasMany,所以它 return 是一个集合。您不能从集合中调用相关模型函数。
你可以把它转储到 tinker 上以进一步理解我的意思。
我目前正在尝试使用 Laravel 关系来使用用户模型访问我的成就模型,我使用此关系代码:
public function achievements()
{
return $this->hasMany('App\Models\User\Achievement');
}
我可以轻松地进行一些 eloquent 查询,但是我无法访问我在那里创建的任何方法,我无法访问此方法:
class Achievement extends Model
{
public function achievementsAvailableToClaim(): int
{
// Not an eloquent query
}
}
使用以下代码:
Auth::user()->achievements()->achievementsAvailableToClaim();
我认为我以错误的方式使用了这个 Laravel 函数,因此我在不使用关系的情况下尝试了其他方法:
public function achievements()
{
return new \App\Models\User\Achievement;
}
但这会带来性能问题,因为每次我在用户模型中使用成就函数时都会创建一个新的 class 实例吗?
我正在尝试做的事情的正确方法是什么?
您可以使用 laravel scopes。与局部作用域一样,您可以定义通用约束集,您可以在整个应用程序中轻松 re-use。
在您的情况下,您可以这样使用,在模型中定义范围:
public function scopeAchievementsAvailableToClaim()
{
return $query->where('achivement_avilable', true);
}
你可以这样使用:
Auth::user()->achievements()->achievementsAvailableToClaim();
它不起作用,因为您的 eloquent 关系是一个 hasMany,所以它 return 是一个集合。您不能从集合中调用相关模型函数。
你可以把它转储到 tinker 上以进一步理解我的意思。