如何关联创建数据? laravel eloquent

How to create a data associatively? laravel eloquent

我有一个Post型号:

class Post extends Model
{
    protected $fillable = [
        'title',
        'user_id',
        'token',
        'body'
    ];

    public function favorites()
    {
        return $this->hasMany(Favorite::class);
    }

    public function addFavorite($state = 1)
    {
        $this->favorites()->create(compact('state'));
    }
}

最喜欢的模特:

class Favorite extends Model
{
    protected $fillable = ['user_id', 'post_id', 'state'];
}

当我在 tinker 中测试时:

$post = Post::first();
$post->addFavorite();

它 returns 给我一个错误:

Illuminate/Database/QueryException with message 'SQLSTATE[HYOOO]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into favorites...

为什么在 post 中给出了 user_id?问题是我是否必须输入 user_id 才能实现此目的?

由于 Favorite 模型与 Post 模型相关并且您通过 relation()->create() 创建它,您可以跳过指定 post_id 因为 Laravel 可以推断它.但是您必须指定 user_id,因为您的代码无法知道 favourite.user_idpost.user_id 是相同的。所以简而言之:是的,你必须指定 user_id

是否需要 user_id 的问题由您决定。以后会不会派上用场?将它放在 posts table 上就足够了吗?

它正在询问 user_id,因为您在收藏夹 table 中的那个字段上没有默认值字段。您可以设置一个默认值,将其从 table 中删除(如果您决定不需要它),或者在通过关系创建时提供它:

class Post extends Model
{
    protected $fillable = [
        'title',
        'user_id',
        'token',
        'body'
    ];

    public function addFavorite($state = 1)
    {
        $this->favorites()->create([
            'state' => $state,
            'user_id' => $this->user_id,
        ]);
    }

    public function removeFavorite()
    {
        $this->addFavorite(0);
    }
}

不要忘记在 Post 模型中包含 favorites 的关系定义。

根据复数名称,似乎post有很多收藏夹,但是你的removeFavorite()方法调用了addFavorite方法??这实际上不会删除任何东西 - 它会创建一个新记录。