我想在每个帖子中显示带有帖子

时间:2020-06-09 16:44:59

标签: php sql laravel

错误:

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `posts` (`title`, `body`, `updated_at`, `created_at`) values (fdsfsd, dfds, 2020-06-09 16:32:53, 2020-06-09 16:32:53))

这是PostsController

public function store(Request $request)
{
    $this->validate($request,[
        'title'=>'required',
        'body'=>'required'
    ]);
    $post = new  Post ;
    $post->title = $request->input('title');
    $post->body= $request->input('body');
    $post->save();
    return redirect('/posts')->with('success','Post created');
}

这是我所做的迁移

public function up()
{
    Schema::table('posts',function($table){
    $table->String('user_name');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('posts',function($table){
        $table->dropColumn('user_name');
        });
    }
}

当我输入以下内容时:php artisan migrate:rollback,商店功能可以完美运行,但是帖子中没有创建它的用户名

并感谢您的进步。

1 个答案:

答案 0 :(得分:0)

您的代码中有很多弱点...。

列“ user_name”的位置是“ users”表而不是“ posts”表,因此不应进行迁移....

您必须在存储方法中以及在Post模型中的$ fillable中设置“ user_id”,例如:

class Post extends Model
{
$protected $fillable=['title','body','user_id'];
public function user()
{
return $this->belongsTo(User::class,'user_id');
}
}

然后..在您的控制器中,您必须从当前登录的用户那里获取“ user_id”:

public function store(Request $request)
{
    $this->validate($request,[
        'title'=>'required',
        'body'=>'required'
    ]);
    $post = new  Post() ;
    $post->title = $request->input('title');
    $post->body= $request->input('body');
$post->user_id=$request->user()->id;
    $post->save();
    return redirect('/posts')->with('success','Post created');
}

您必须确保绑定到此控制器方法的路由应具有身份验证中间件...

现在:如果要使用用户名发帖:

$postWithUserName=Post::where('id',$post_id)->with('user:id,name')->get();

确保在用户表中有一列“名称” ...