BelongsTo类的create方法在哪里?

时间:2018-07-08 16:24:02

标签: laravel eloquent

我有一个用于上传的通用课程。

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

2 个答案:

答案 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,
]));