在 laravel 5.4 中更新列值

Posted

技术标签:

【中文标题】在 laravel 5.4 中更新列值【英文标题】:update column value in laravel 5.4 【发布时间】:2019-03-16 11:18:14 【问题描述】:

我想更新帖子的隐私

我的控制器

   public function changePostsPrivacy(Request $request)
            $userId = $request->user()->id;
            $postid = $request->get('id');
            //dd($postid);
            $privacy = $request->get('privacy');//dd($privacy);
            $user = User::where(['id' => $userId, 'hide' => 0])->first();
            if($user && $postid && in_array($privacy, [1,0]))
                DB::table('posts')->update(['creator_id' => $userId, 'id' => $postid],[
                    'privacy' => $privacy,
                ]);
            
        

路线:

 Route::group(['middleware'=>['auth:api', \App\Http\Middleware\OnlyRegisteredUsers::class]], function()
        /**
         * Group for registered users only APIs
         */
        Route::post('changePostsPrivacy','UserController@changePostsPrivacy');
    );

迁移

 public function up()
    
        Schema::create('posts', function (Blueprint $table) 
            $table->increments('id');
            $table->string('title');
            $table->longText('content');
            $table->string('short_description');
            $table->unsignedInteger('media_id')->nullable();
            $table->foreign('media_id')->references('id')->on('medias');
            $table->unsignedInteger('creator_id');
            $table->foreign('creator_id')->references('id')->on('users');
            $table->boolean('hide')->default(0);
            $table->timestamps();
        );
    

此迁移中添加了新列

 public function up()
        
            Schema::table('posts', function (Blueprint $table) 
                $table->integer('privacy')->after('creator_id');
            );
        

当我想为任何帖子添加隐私时,它会给我一个错误

“消息”:“SQLSTATE [23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败 (webdb.comments, 约束comments_post_id_foreign 外键 (post_id) 参考posts (id)) (SQL: 更新posts 设置 creator_id = 17, id = 48)",

【问题讨论】:

【参考方案1】:

你必须在更新隐私帖子中使用 where 条件

DB::table('posts')->where(['creator_id' => $userId, 'id' => $postid])->update(['privacy' => $privacy])

【讨论】:

【参考方案2】:

如果你有 Post 模型,你可以这样做:

Post::where(['creator_id' => $userId, 'id' => $postid])->update(['privacy' => $privacy]);

为防止任何外键错误,您应该使用validation request 来检查提供的user_idpost_id exists 是否存在。

【讨论】:

是的,我试过了,我从邮递员那里发送数据,当我发送 1、0 或空字段时它可以工作,但是当我传递任何其他数据时它会给我一个错误 从 POSTMAN 发送数据通常会失败,因为您的路由必须使用 CSRF 令牌中间件进行保护。所以你需要一个有效的令牌来发布你的数据。【参考方案3】:
public function changePostsPrivacy(Request $request)
            $userId = $request->user()->id;
            $postid = $request->get('id');
            $privacy = $request->get('privacy');
            $user = User::where(['id' => $userId, 'hide' => 0])->first();
            if($user && $postid && in_array($privacy, [1,0]))
                DB::table('posts')->update([
                    'privacy' => $privacy,
                ]);
            

创作者id和id不需要更新。

【讨论】:

【参考方案4】:

你也可以试试这个。

$post = Post::where(['creator_id' => $userId, 'id' => $postid])->first();
$post->privacy = $privacy;
$post->save();

【讨论】:

以上是关于在 laravel 5.4 中更新列值的主要内容,如果未能解决你的问题,请参考以下文章

方法验证不存在 - Laravel 5.4

在 Laravel 5.4 中更新数据透视表 [重复]

使用迁移 Laravel 5.4 更新列

Laravel 5.4 作曲家更新错误

更新到 Laravel 5.4 时出错

Laravel 5.4:如何遍历请求数组?