我有一个用于上传的通用课程。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class File extends Model
{
protected $guarded = ['id'];
}
将在每个人上指定File
模型的ID作为化身:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Person extends Model
{
public function avatar()
{
return $this->belongsTo('App\File');
}
public function putAvatar($file)
{
$path = $file->store('avatars');
// This would work if `avatar()` was a `hasMany()` relation
$this->avatar()->create([
'path' => $path,
]);
}
}
这不能完全按预期工作,但是会在数据库中创建File
模型。为什么?
$this->avatar()
是BelongsTo
的实例,没有create
方法。我检查了该类,包含的特征以及它扩展的Relation
类。 Reference here。
这是怎么回事,创建新模型的代码在哪里?
我尝试使用ReflectionMethod
,但在$this->avatar()->create()
工作时,new ReflectionMethod($this->avatar(), 'create')
返回了一条ReflectionException
,消息为Method Illuminate\Database\Eloquent\Relations\BelongsTo::create() does not exist
。
答案 0 :(得分:1)
没有任何方法可以将实体保存在belongsTo关系上。创建实体后,您可以将其与模型关联。
$avatar = File::create([...]);
$this->avatar()->associate($avatar)->save();
要允许查询关系,会将未定义的方法调用传递给确实具有create方法的Eloquent Builder实例。
所有关系扩展了Relation类,该类定义:
public function __call($method, $parameters)
{
if (static::hasMacro($method)) {
return $this->macroCall($method, $parameters);
}
$result = $this->query->{$method}(...$parameters);
if ($result === $this->query) {
return $this;
}
return $result;
}
答案 1 :(得分:0)
用于belongsTo()
的方法应该是save()
,而不是created()
。确保将File
类作为参数传递:
$this->avatar()->save(new File([
'path' => $path,
]));