我正在尝试使用laravel显示数据。我目前想在系统上显示酒店的评论。在修改代码之前,我的帖子一直在显示,但是在以下代码中,根本没有帖子显示,而我正在为这种情况而苦苦挣扎。
PostsController.php
public function show($id)
{
$post = Post::find($id);
$review = Post::find(1)->reviews()->where('title', 'posts_title')->get();
return view('posts.show', compact('post', 'review'));
}
Post.php
public function reviews()
{
return $this->hasMany('App\Review', 'title', 'post_title');
}
Review.php
public function post()
{
return $this->belongsTo('App\Post');
}
变量title
是评论的标题。 post_title
是酒店的标题。两个标题都应该匹配(在我的系统中,它们匹配)。我知道您会使用ID,但是我认为这很困难
我想显示与合适的酒店匹配的评论。以前没考虑过,我所有的酒店都在显示,但是更改代码后它不会显示
答案 0 :(得分:2)
您的查询中没有Review
的原因是此行:
$review = Post::find(1)->reviews()->where('title', 'posts_title')->get();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
使用where()
子句时,第一个参数是要查询的列名,第二个参数是要比较的实际值。不是列名。因此,这将尝试查找标题为"posts_title"
(字面意义)的每条评论...因此,您返回了0条记录。
现在,您还需要了解关系如何工作。如果您在Post
模型中定义关系,如下所示:
# Post.php
public function reviews()
{
return $this->hasMany('App\Review', 'title', 'post_title');
}
其工作方式如下:它将获得所有reviews.title
列等于posts.post_title
列的评论。
因此,如果此设置对您的dabatase来说是正确的,则无需重新声明此条件,只需执行查询并调用关联方法即可:
# PostsController.php
$related_reviews = Post::find(1)->reviews;
还要注意,需要使用反向关系,您还需要告诉laravel要使用的自定义PK / FK,以获得正确的结果。
# Review.php
public function post()
{
return $this->belongsTo('App\Post', 'title', 'post_title');
}
请注意,如果您在数据库中以posts
的身份管理酒店,则此模型和表格的正确名称分别应为Hotel
和hotels
。