Почему я получаю 'нулевые' результаты от отношений Laravel 'hasOne'? - PullRequest
0 голосов
/ 07 октября 2019

Таблица пользователей users:

id
email
password

Таблица сообщений posts

id
user_id
title
body

здесь я использую модель сообщения

Моя модель пользователя содержит:

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

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Измените ваши отношения на hasMany

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

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

Также убедитесь, что в вашем * настроен внешний ключ posts миграция

Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->text('body');
    $table->unsignedBigInteger('user_id');
    // ---- Here ------
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->timestamps();
});

Вы можете использовать этот код для заполнения некоторых сообщений, чтобы протестировать

Route::get('/', function () {
    App\User::first()->posts()->createMany([
        ['title' => 'Example Title', 'body' => 'Example Body'],
        ['title' => 'Another Title', 'body' => 'Another Body'],
    ]);
});

Теперь вы можете получить коллекцию сообщений для первого пользователя, подобного этому

Route::get('/posts', function () {
    return App\User::first()->posts;
});

Надеюсь, это поможет

0 голосов
/ 07 октября 2019

Обратите внимание, что имя функции чувствительно к регистру. В вашей пользовательской модели вы определили его как posts, но пытаетесь получить к нему доступ с помощью Post. Поскольку в вашей пользовательской модели нет метода с именем Post, он возвращает null, а не выдает ошибку.

Также, как и другие рекомендовали, я думаю, что вы хотите здесь hasMany() вместо hasOne(). Как только вы это исправите, получите доступ к отношениям в Tinker следующим образом:

>>> User::find(1)->posts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...