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



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

用户模型

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 IlluminateDatabaseEloquentRelationsHasMany::cover()

我的代码中有什么问题?

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

您正在使用hasMany Laravel关系。并且该hasMany返回相关记录的收集(项目(。而且您无法直接调用任何模型功能。

但是,如果您打电话给此功能。您需要首先循环项目,如以下示例: -

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

上面的代码将为您提供输出。尝试一下。

如果要获取文件的所有封面,则可以这样做:

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

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

从中,您可以执行以下操作:

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
    }
}

最新更新