关系方法必须在laravel雄辩中返回一个对象

时间:2017-08-09 10:27:46

标签: php laravel laravel-5 eloquent laravel-5.3

我正在尝试找到一个有条件的行,那就是......

用户有很多个人资料图片,但有一张图片是is_main

所以这就是我写的

public function profile_picture()
{
    return $this->hasMany('App\User_profile_picture');
}

public function active_picture()
{
    return $this->profile_picture()->find($this->is_main);
}

现在我通过

访问它
$picture = Auth::user()->active_picture;

它说

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

为了让它发挥作用,我必须做些什么?

3 个答案:

答案 0 :(得分:1)

您的代码应为

public function profile_picture()
{
    return $this->hasMany('App\User_profile_picture');
}

您缺少退货声明

答案 1 :(得分:0)

您必须使用

public function profile_picture()
{
   return $this->hasMany(App\User_profile_picture::class);
}

答案 2 :(得分:0)

如果要将Model方法用作属性,则必须返回关系。否则,您需要将其作为()运算符的方法来调用。与解释here一样。

所以问题的解决方案是:

$picture = Auth::user()->active_picture();

编辑:TIL你也可以设置一个自定义的雄辩访问者:

public function getActivePictureAttribute()
{
    return $this->profile_picture()->find($this->is_main);
}

$picture = Auth::user()->active_picture;

是的,你必须在camelCase中编写get ...属性,然后可以使用snake_case / kebab-case或camelCase中的属性。 (参见eloquent $ snakeAttributes布尔变量。)