Laravel отношение модели в той же таблице - PullRequest
0 голосов
/ 13 марта 2020

Я работаю над проектом Laravel 5.7, где у меня есть три таблицы words, synonym_word и antonym_word.

  • words таблица имеет два столбца id и word
  • synonym_word имеет три столбца id, word_id и synonym_id
  • antonym_word имеет три столбца id, word_id и antonym_id

Я храню все слова, их синонимы и антонимы в таблице слов и ссылаюсь на синонимы и антонимы в соответствующих таблицах.

Word. php

class Word extends Model
{
    public function synonyms()
    {
        return $this->hasMany('App\Synonym');
    }

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

Я запрашиваю синонимы так: -

$synonyms = Word::find(1)->synonyms;

Приведенный выше запрос дает все синонимы и их идентификаторы из таблицы Synonym, но мое фактическое слово синонимов хранится в таблице Words.

Как получить синонимы из таблицы Words?

Ответы [ 2 ]

1 голос
/ 13 марта 2020
$synonymsWithWord = Word::find(1)->synonyms()->with('word')->get();

чтобы использовать это, класс Synonyms должен иметь отношение, определенное с Word, как показано ниже.

class Synonym extends Eloquent {

    public function word()
    {
        return $this->belongsTo('App\Word');
    }

}

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

0 голосов
/ 13 марта 2020

Я решил это, используя точку (.) В запросе.

Word. php

class Word extends Model
{
    public function antonyms()
    {
        return $this->hasMany(Antonym::class);
    }

    public function synonyms()
    {
        return $this->hasMany(Synonym::class);
    }
}

Синоним. php

class Synonym extends Model
{
    public function word()
    {
        return $this->belongsTo(Word::class);
    }
}

WordController. php

class WordController extends Controller
{
    public function index()
    {
        $words = Word::with(['synonyms.word'])->get();
        return view('words', compact('words') );
    }   
}

Обратите внимание на точку (.) Между синонимами и словом.

words.blade. php

@foreach($words as $word)
    <h4>{{ $word->word }}</h4>
    @foreach($word->synonyms as $s)
        {{ $s->id }} - {{  $s->word->word }}
        <br>
    @endforeach
@endforeach
...