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

Я пытаюсь получить название категории для отображения в таблице, но получаю сообщение об ошибке: «Попытка получить свойство 'category' не-объекта (View: C: \ xampp \ htdocs \ retro \ resources \ views \ admin \ games \ index.blade.php)! вместо

Вот таблица для кода:

@foreach($games as $game)
    <tr>
        <td>{{ $game->title }}</td>
        <td>{{ $game->image }}</td>
        <td>£{{ $game->price }}</td>
        <td>{{ $game->category_id->category }}</td>
        <td>{{ $game->sold }}</td>
        <td>{{ $game->promote }}</td>
        <td>
            <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#edit">Edit</button>
        </td>
    </tr>
@endforeach

Модель Categories:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Categories extends Model
{
    public function games()
    {
        return $this->hasMany('App\Games');
    }
}

Модель Games:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Games extends Model
{
    public function category()
    {
        return $this->hasOne('App\Categories');
    }
}

А вот миграция, которую я использую

public function up()
{
    Schema::create('games', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->string('image');
        $table->integer('price');
        $table->integer('category_id')->index();
        $table->integer('sold');
        $table->integer('promote');
        $table->timestamps();
    });
}

Я совершенно уверен, что это ошибка в отношениях, но я не понимаю, что это такое.


person Matt B    schedule 05.07.2019    source источник
comment
Что вы пытались отладить эту ошибку? Вы проверили, что содержит $game->category_id, может быть, целое число (как вы его определили)?   -  person Nico Haase    schedule 05.07.2019


Ответы (2)


$game->category_id не вернет отношения, как вы это назвали public function category(). Вам нужно использовать

<td>{{ $game->category->name }}</td>

(Не уверен, какой столбец category вы пытаетесь отобразить, угадали на name)

Также следуйте соглашениям Laravel. Названия моделей в единственном числе, так что это должно быть

class Game extends Model { ... }

class Category extends Model { ... }

Кроме того, вам может потребоваться предоставить внешний ключ, если связь не совсем работает:

return $this->hasOne('App\Categories', 'category_id');

Я вижу другую проблему. Вы не можете использовать hasMany в паре с hasOne; где-то там должен быть belongsTo. Game принадлежит Category, а Category может иметь много Game:

Games.php

class Games extends Model
{
    public function category()
    {
      return $this->belongsTo('App\Categories', 'category_id');
    }
}
person Tim Lewis    schedule 05.07.2019
comment
Отношение (hasOne) неверное. Не внешний ключ. - person Chin Leung; 05.07.2019
comment
Ага, теперь лучше :) - person Chin Leung; 05.07.2019

Вы должны изменить это:

<td>{{$game->category_id->category}}</td>

в это:

<td>{{$game->category->id}}</td>

// or if you have name property in the category table

<td>{{$game->category->name}}</td>

Потому что в вашей Game модели есть category функция, которая вернет для нее объект отношения на основе category_id, хранящегося в таблице.

В вашей модели Game вы, вероятно, можете вместо этого использовать это отношение:

public function category()
{
  return $this->belongsTo('App\Categories', 'category_id');
}
person nakov    schedule 05.07.2019
comment
Когда я пытаюсь это сделать, я получаю сообщение об ошибке «SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец« Categories.games_id »в« where clause »(SQL: выберите * из categories, где _2 _._ 3_ = 1 и _4 _._ 5_ не является нулевым пределом 1) (View: C: \ xampp \ htdocs \ retro \ resources \ views \ admin \ games \ index.blade.php) `` - person Matt B; 05.07.2019
comment
Какую ошибку вы получаете? И, пожалуйста, также проверьте мою правку. - person nakov; 05.07.2019
comment
Показанная вами ошибка, похоже, исходит из другого места в вашем представлении. - person nakov; 05.07.2019