我试图通过关系从模型中调用自定义方法。
用户模型:
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()
我的代码有什么问题?
答案 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
}
}