Как узнать, когда мое отношение возвращает объект, а когда массив? - PullRequest
2 голосов
/ 24 марта 2019

У меня мало связей в моей модели. Ответ:

/** Reply.php */

public function thread()
{

    return $this->belongsTo(Thread::class);
}

public function user()
{
    return $this->belongsTo(User::class);
}

Моя таблица ответов получила user_id и thread_id

И затем я пытаюсь получить имя пользователя.это:

$reply->user->name

И это работает.

Но когда я пытаюсь получить поток title:

$reply->thread->title

Я получаю ошибку:

Попытка получить свойство title необъекта

И если мне нужно получить метод только заголовка, я знаю:

$reply->thread['title']

В чем разница междуметоды я использую?Почему в одном случае я получаю пользователя как объект, а в другом я получаю поток как массив?


Обновление:

Мои Reply Отношения модели:

public function user()
{
    return $this->belongsTo(User::class);
}

public function favorites()
{
    return $this->morphMany(Favorite::class, 'favorited');
}

public function thread()
{
    return $this->belongsTo(Thread::class);
}

Отношения модели My Thread:

public function replies()
{
    return $this->hasMany(Reply::class);
}

public function user()
{
    return $this->belongsTo(User::class);
}

public function category()
{
    return $this->belongsTo(Category::class);
}

И отношения модели User:

public function threads()
{
    return $this->hasMany(Thread::class)->latest();
}

public function replies()
{
    return $this->hasMany(Reply::class)->latest();
}

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Когда вы делаете

один на один

отношение, тогда отношение возвратит object Когда вы делаете

один ко многим

Отношение вернется array of objects

2 голосов
/ 24 марта 2019

Класс Model реализует интерфейс Arrayable, это означает, что вы можете обращаться к атрибутам также, как если бы это был array, вот почему эта работа:

$reply->thread['title'];

Когда выиспользуйте отношение BelongsTo, это предполагает возвращение объекта (экземпляра вашей модели) или null, если это отношение не установлено, поэтому вы можете использовать «магические методы» для доступа к таким атрибутам:

$reply->thread // an object
$reply->thread->title // getting attributes using magic methods

Но что происходит, когда отношения не установлены?что ж, отношения вернутся null, поэтому, когда вы сделаете это:

$reply->thread->title

Это вызовет ошибку:

Попытка получить заголовок свойства не-объекта

Поскольку вы пытаетесь получить доступ к атрибуту title null.


Обновление:

Вот где, я думаю, ошибка,В новейшей версии Laravel (на сегодняшний день: Laravel 5.8) типы ключей первичных ключей изменены с integers на bigIntegers(), и это для всех таблиц:

Schema::create('replies', function (Blueprint $table)
{
    $table->bigIncrements('id'); // <---- equivalent to bigInteger
    $table->integer('user_id')->unsigned;
    $table->integer('thread_id')->unsigned;
    $table->text('body');
    $table->timestamps();
});

ТакВаши внешние ключи должны быть также большими целыми числами, попробуйте это:

Schema::create('replies', function (Blueprint $table)
{
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id'); // <-----------
    $table->unsignedBigInteger('thread_id'); // <-----------
    $table->text('body');
    $table->timestamps();
});

Проверьте эта статья связана с этой проблемой.

1 голос
/ 24 марта 2019

Я думаю, что единственной причиной этой ошибки будет null возврат из отношения.В этом случае

$reply->thread['title']

не будет работать, пожалуйста, проверьте это?

Если работает $reply->thread['title'], я хотел бы увидеть выводdd($reply->thread); пожалуйста.

Если это не работает, и причиной ошибки действительно является null возврат, вам просто нужно проверить, что

$reply->thread не равен нулю перед использованиемэто.

Дайте мне знать, помогло ли это вам:)

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