使用一对多关系在laravel中显示数据

时间:2020-02-02 21:26:04

标签: laravel

我正在尝试使用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,但是我认为这很困难

我想显示与合适的酒店匹配的评论。以前没考虑过,我所有的酒店都在显示,但是更改代码后它不会显示

1 个答案:

答案 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的身份管理酒店,则此模型和表格的正确名称分别应为Hotelhotels