Отображать данные в laravel, используя отношение один ко многим - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь отобразить данные, используя 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');
}

Обзор . php

public function post()
{    
    return $this->belongsTo('App\Post');
}

переменная title является заголовком обзора. post_title это название отеля. Оба названия должны совпадать (в моей системе они совпадают). Я знаю, что вы будете использовать идентификаторы, но я думаю, что это сложно в моей ситуации

Я хочу отобразить отзыв, соответствующий нужному отелю. Имейте в виду, ранее все мои отели отображались, однако после изменения кода не отображается

1 Ответ

2 голосов
/ 03 февраля 2020

Причина, по которой вы не получаете Review s в своем запросе, заключается в следующей строке:

$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 .

Таким образом, если эта настройка верна для вашей базы данных, вам не нужно повторно указывать это условие, просто выполните запрос и вместо этого вызовите метод отношений:

# 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, соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...