我在表注释上有引用段问题。 我想从表格帖子中添加子弹帖子。
因此,当我插入评论时,它可以将posttable中的commentable_slug放入。这是我的评论表和帖子表。 commentable_id = 32,表示post_id,您可以从帖子中看到弹头,即(quia-pariatur-expedita-vel-quia)
和我的迁移
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('parent_id')->unsigned()->nullable();
$table->text('body');
$table->integer('commentable_id')->unsigned();
$table->foreign('commentable_id')->references('id')->on('posts')->onDelete('cascade');
$table->string('commentable_slug')->nullable();
$table->foreign('commentable_slug')->references('slug')->on('posts')->onDelete('cascade');
$table->string('commentable_type');
$table->timestamps();
});
我在commentable_slug中使用null,因为它总是警告我无法添加或更新子行:外键约束失败。
当我尝试我的可注释字段为空时。
我的评论模型和关系
class Comment extends Model
{
public function user()
{
return $this->belongsTo(Member::class);
}
public function post()
{
return $this->belongsTo(Post::class);
}
public function replies()
{
return $this->hasMany(Comment::class, 'parent_id');
}
}
和我的帖子模型
class Post extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function comments()
{
return $this->morphMany(Comment::class, 'commentable')->whereNull('parent_id');
}
}
如何解决我的问题?
答案 0 :(得分:1)
好吧,我想我了解您要做什么。问题在这里
public function post()
{
return $this->belongsTo(Post::class);
}
由于它具有多态关系,因此您不能使用标准的belongsTo
,因为您的表中没有post_id
。
您需要在评论模型中使用类似morphTo
的功能
public function commentable()
{
return $this->morphTo();
}
因此,当您致电
$comment->commentable()->get();
然后它将返回链接的任何多态模型。
由于您还没有给出任何用例,因此很难给出精确的代码示例。
但是,正如评论中所说,您不需要同时链接id和slug。另外,我相信MySQL在使用文本字段作为键时会遇到问题,我认为您需要指定字段长度,但不能指定100%的长度,也许对MySQL有更多了解的人可以确认这一点。