自定义方法不适用于HasMany关系

时间:2019-05-21 11:01:42

标签: laravel relation

我试图通过关系从模型中调用自定义方法。

用户模型

class User extends Model
{
  public function files()
  {
    return $this->hasMany(Files::class, 'file_id', 'id');
  }

}

文件模型

class Files extends Model
{
  public function cover() 
  {
     dd('blah blah');
  }
}

在我的控制器中,我说:

$user = User::find(1);
$user->files()->cover();

但是我会收到此错误:

Call to undefined method Illuminate\Database\Eloquent\Relations\HasMany::cover()

我的代码有什么问题?

2 个答案:

答案 0 :(得分:3)

基本上,您是在集合中调用cover()方法。这就是为什么它不起作用。

您正在使用hasMany Laravel关系。并且此hasMany返回相关记录(项目)的集合。而且您不能直接在其上调用任何模型函数。

但是,如果您想在此调用函数。您需要首先循环这些项目,例如以下示例:-

$user = User::find(1);
foreach($user->files() as $file) {
    $file->cover();
}

以上代码将为您提供输出。试试这个。

答案 1 :(得分:0)

如果要获取文件的所有封面,可以执行以下操作:

$user = User::with('files.cover')->find(1);

$covers = $user->files->pluck('cover')->flatten();
  

我想使用此方法进行检查,然后再存储封面。因为我需要在插入前检查封面,所以我无法使用create方法,它将是创建的别名。所以我无法覆盖创建方法?

由此,您可以执行以下操作:

foreach($user->files as $file){

    $cover = $file->cover()->firstOrCreate(['attribute' => $value]);

    // If you want to check if you just created the cover 
    if($cover->wasRecentlyCreated){
       // Do stuff
    }
}