【发布时间】:2017-11-01 14:18:22
【问题描述】:
我有三个模型,我创建了帖子和评论以及用户。我正在尝试在两者之间建立关系。评论和发布它们都有一个与用户表上的 id 匹配的字段“user_id”。以下是我要设置的关系:
comment.php:
<?php
namespace App;
class Comment extends Model
{
//
public function post(){
return $this->belongsTo(Post::class);
}
public function user(){
return $this->belongsTo(User::class);
}
}
Post.php:
<?php
namespace App;
class Post extends Model
{
public function comments(){
return $this->hasMany(Comment::class);
}
public function addComment($body, $name, $email){
$this->comments()->create(compact('body','name','email'));
}
public function user(){ // $comment->user->name
return $this->belongsTo(User::class);
}
}
用户.php
<?php
namespace App;
use App\Post;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function post(){
return $this->hasMany(Post::class);
}
}
现在您可以看到评论属于用户,帖子属于用户。
但是,当我尝试通过 tinker 创建新帖子时(没有在数据库上创建用户或登录用户),我可以毫无问题地创建帖子;
这告诉我,帖子必须有用户和评论也必须有用户的关系不起作用!知道如何解决这个问题吗?
迁移:
create_posts_migration:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->string('title');
$table->text('body');
$table->string('image');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
create_comment_migration:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCommentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id');
$table->integer('user_id');
$table->string('email');
$table->string('name');
$table->string('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('comments');
}
}
【问题讨论】:
-
请出示您的 User.php 文件。
-
我编辑了帖子,所以现在就在那儿
-
检查您是否在“posts”表中添加了“user_id”列。
-
是的,它就在那里!已检查。
-
仅仅因为你有一个
user_id字段并不意味着它会自动强制关系。您需要在迁移中添加外键约束以强制使用有效用户设置该字段。分享您的迁移。
标签: php database laravel eloquent