【问题标题】:How to create a data associatively? laravel eloquent如何关联地创建数据? laravel 雄辩的
【发布时间】:2019-11-20 19:29:17
【问题描述】:

我有一个帖子模型:

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();

它在下面返回一个错误:

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

为什么在发帖时会问user_id?问题是我一定需要输入user_id 来实现这一点吗?

【问题讨论】:

    标签: laravel eloquent laravel-6 eloquent-relationship


    【解决方案1】:

    user_id 是否必要由您决定。以后会不会派上用场?把它放在帖子表上就足够了吗?

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

    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 的关系定义。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 啊,所以没办法处理这个问题。我需要硬编码$this->user_id
      猜你喜欢
      • 2019-01-10
      • 2014-08-14
      • 1970-01-01
      • 2014-10-18
      • 2015-03-14
      • 2018-11-28
      • 2015-01-11
      • 2021-06-03
      • 2020-03-26
      相关资源
      最近更新 更多