проблема с отношением laravel elquent

У меня есть создатель имени столбца в таблице, в которой хранится идентификатор пользователя. При извлечении записей я использую отношение принадлежности. Я получаю данные, но не могу их отобразить.

Примечание. Эта ветка не решает мою проблему

Схема таблицы категорий


Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->unique();
            $table->string('slug')->unique();
            $table->string('banner')->nullable();
            $table->boolean('status')->default(false);
            $table->bigInteger('creator');
            $table->bigInteger('moderator');
            $table->timestamps();
        });

схема таблицы пользователей

Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

Модель категории:


   public function creator(){
        return $this->hasOne(User::class, 'id',  'creator')->select('id', 'name');
    }

Код контроллера категории:


$records = Category::with(['creator'])->paginate(env('REC_LIMIT'));

данные я понял:


"data":[{"id":1,"name":"Uncategorized","slug":"uncategorized","banner":null,"status":1,"creator":{"id":1,"name":"demon slayer"},"moderator":1,"created_at":"2019-11-03 12:08:33","updated_at":"2019-11-04 11:11:01"},

обратите внимание, если предложение with удалено в запросе, я получаю:


"data":[{"id":1,"name":"Uncategorized","slug":"uncategorized","banner":null,"status":1,"creator":1,"moderator":1,"created_at":"2019-11-03 12:08:33","updated_at":"2019-11-04 11:11:01"},

в файле лезвия я делаю ниже код для печати имени пользователя создателя вместо идентификатора его записи.


$record->creator->name 
//or
$record->creator[0]->name

в настоящее время я получаю это:

Facade\Ignition\Exceptions\ViewException
Trying to get property 'name' of non-object (View: /Users/dragonar/Dev/pdp/resources/views/backend/category/index.blade.php) 


person princeoo7    schedule 04.11.2019    source источник
comment
Пожалуйста, попробуйте переписать свой вопрос. Это трудно читать. Я изо всех сил старался улучшить его в отношении языка, но я не совсем понял вашу проблему.   -  person normanius    schedule 04.11.2019
comment
Не могли бы вы добавить свою таблицу пользователей и категорий? Если вы это сделаете, мы сможем лучше понять вас.   -  person rklaasboer    schedule 04.11.2019
comment
вопрос довольно простой. мне нужно имя пользователя, который создал категорию или модерировал запись категории. для этого у меня есть столбец создателя и модератора в таблице категорий. теперь я использую предложение with, чтобы получить имя и идентификатор создателя (чтобы я мог связать его профиль как гиперссылку на имя). когда, если я просто верну запись как json. я вижу данные под создателем. но затем я делаю $record-›creator-›name. это дает указанную ошибку.   -  person princeoo7    schedule 04.11.2019
comment
не имеет метода отношения, названного так же, как поле/атрибут... Eloquent разрешит атрибут через динамическое свойство, прежде чем он разрешит отношение по этому имени, $record->creator всегда будет «полем» из таблицы, а не отношения в этом случае... нужно лучше называть ваши внешние ключи   -  person lagbox    schedule 04.11.2019


Ответы (2)


Вы пробовали вместо

public function creator(){
    return $this->hasOne(User::class, 'id',  'creator')->select('id', 'name');
}

Этот:

public function creator(){
    return $this->hasOne(User::class, 'user_id')->select('id', 'name');
}

Или измените имя функции с creator() на user().

А потом в твоем клинке $record->user->name.

Это то, что я нашел в документах laravel:

Eloquent определяет внешний ключ отношения на основе имени модели. В этом случае автоматически предполагается, что модель Phone имеет внешний ключ user_id. Если вы хотите переопределить это соглашение, вы можете передать второй аргумент в метод hasOne: return $this->hasOne('App\Phone', 'foreign_key'); Источник

person Kabelbaan    schedule 04.11.2019
comment
Вы правы, смена создателя на пользователя работает, но у меня также есть колонка для модератора. Это своего рода создание новой проблемы. - person princeoo7; 04.11.2019
comment
Предполагая, что мое первое предложение использовать «user_id» вместо «id» не сработало. Какую ошибку вы получили? Точно такая же ошибка или другая, чем раньше? - person Kabelbaan; 04.11.2019
comment
Что, если вы попробуете мое первое предложение, но вместо третьего аргумента «создатель». Не иметь 3-го аргумента вообще. Я изменил свой пост, чтобы вы могли скопировать и вставить функцию, которую я впервые предложил. - person Kabelbaan; 04.11.2019
comment
нет, я не получаю данные, так как пользовательская таблица имеет идентификатор, а не user_id в качестве столбца. поэтому требуется третий параметр. - person princeoo7; 04.11.2019
comment
Кажется, что если вы сохраните пункт with, вы уже получите создателя. Вы пробовали $record['creator']->name или хотя бы что-то подобное? (Конечно, если вы используете то, что у вас было сначала). Если это все еще не работает, вы также можете попробовать $record[0]->creator->name или $record[0]['creator']->name что-нибудь подобное. - person Kabelbaan; 04.11.2019

В итоге я переименовал создателя в Creator_id, а в модели функция — это создатель. вот так теперь я могу получить доступ к нужным данным $record->creator->name или $record->creator->id.

я хотел, чтобы вместо того, чтобы создатель возвращал мне идентификатор из исходного кода, я мог бы сделать $record->creator->name или $record->creator->id напрямую.

person princeoo7    schedule 05.11.2019