Невозможно определить отношения в laravel 5.7

У меня есть две таблицы как sbj_topics и difficulty_level_sbj_topic, поэтому я хочу определить отношения между ними для извлечения записей, поэтому для установления отношений я сделал это,

SbjTopic.php:

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

И в DiffiLvlSbjTopic.php:

protected $table = 'difficulty_level_sbj_topic';
public function sbj_topics() {
    return $this->belongsTo('App\SbjTopic');
}

После этого я вернул данные в представление как:

$easy = DiffiLvlSbjTopic::where(['subject_id' => $id, 'difficulty_level_id' => 2])->get();
return view('diffi_lvls.show', compact('easy'));

Затем в Посмотреть я сделал это:

@foreach($easy as $easy)
    {{ $easy->sbj_topics }}
@endforeach

но страница пуста, и когда я это делаю {{ $easy->sbj_topics->sbj_topic_name }}пытаясь получить свойство undefined! приходит.

Основная цель создания отношения — отобразить Тема Название темы, потому что у меня есть иностранный ключ как sbj_topic_id в таблице difficulty_level_sbj_topic, поэтому, если у кого-то есть другая идея сделать это без отношения, это будет здорово.

Это возврат коллекции? dd($easy)

Iftikhar uddin 24.02.2019 08:33

да, он возвращается, но не значения отношений

Usman Developer 24.02.2019 08:33
sbj_topic_id ваш FK прав? Тогда что такое subject_id? $easy = DiffiLvlSbjTopic::where(['subject_id' => $id, 'difficulty_level_id' => 2])->get();
Iftikhar uddin 24.02.2019 08:40

У меня есть другое поле в таблице difficulty_level_sbj_topic.

Usman Developer 24.02.2019 08:42

@UsmanDeveloper У предмета много уровней сложности или у уровня сложности много предметов? Посмотрите на порядок ваших отношений. Кроме того, явно указывайте внешние ключи, чтобы Laravel ничего не предполагал сам по себе.

nice_dev 24.02.2019 09:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваши обе переменные не должны быть $easy, это может быть что-то вроде $easy as $easySingle. И добавьте петлю внутри, например

@foreach($easy as $easySingle)
    foreach ($easySingle->sbj_topics as $topic) {
      $topic->property;
    }   
@endforeach   

Приходит ошибка Недопустимый аргумент для foreach()

Usman Developer 24.02.2019 08:26

опять пусто братан думаю в отношениях бардак

Usman Developer 24.02.2019 08:29

снова ошибка Недопустимый аргумент для foreach() тоже сделала это sbj_topics()

Usman Developer 24.02.2019 08:33
Ответ принят как подходящий

Разбейте это:

  • SbjTopic - имеет много difflevels
  • difflevel принадлежит aSbjTopic

С этим пониманием я вижу, что вы получаете difflevels (DiffiLvlSbjTopic). На самом деле это то, что вы передаете своему лезвию.

Итак, во-первых: завершите свои отношения, указав внешние ключи. то есть: В модели SbjTopics:

public function difficulty_level_sbj_topic() {
    return $this->hasMany('App\DiffiLvlSbjTopic', 'subject_id');
}

при этом вы знаете, что в 'difficulty_level_sbj_topic' у вас должен быть столбец subject_id. Теперь определите обратную связь в вашей модели DiffiLvlSbjTopic:

public function sbj_topics() {
    return $this->belongsTo('App\SbjTopic', 'subject_id');
}

Со всем этим в вашем контроллере или маршруте все, что вам нужно сделать, это получить свойства модели DiffiLvlSbjTopic. Например:

public function index () {
     $easy = DiffiLvlSbjTopic::all();
     return view('diffi_lvls.show', compact('easy'));
}

Наконец, на ваш взгляд:

@foreach($easy as $difflevel)
    <div>{{ $difflevel->sbj_topics->name }} </div>
@endforeach

Вот и все.

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

Usman Developer 24.02.2019 09:12

@UsmanDeveloper Ваша большая ошибка заключается в том, что вы не следуете соглашению об именах, предложенному в документах. Следуя инструкциям, вы избежите на 90 % таких невынужденных ошибок.

Tpojka 24.02.2019 16:54

@Tpojka Это правда, но указывать внешние ключи, чтобы избежать магии, обычно не так уж и плохо.

Namoshek 25.02.2019 06:32

Другие вопросы по теме