Laravel Красноречивые отношения по 3 таблицам - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующая настройка таблицы базы данных в существующем проекте Laravel, над которым я начал работать:

sports
    id 
    name

lines
    id 
    sport_id - Foreign Key (lines_sport_id_foreign)
    bet_id - Foreign Key (lines_bet_id_foreign)

bets
    id
    stake

С отношениями, настроенными так:

Спорт. php

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

Линия. php

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

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

Ставка. php

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

Теперь мне нужно создать связь между Sport и Bet. Специально для

  1. Получить все ставки на спорт (спорт-> ставки)
  2. А затем также иметь возможность сортировать виды спорта по наибольшим ставкам (из колонки ставок на ставки)

Я пытался использовать метод Laravel hasManyThrough, например, в Sport

public function bets()
{
    return $this->hasManyThrough('App\Bet', 'App\Line');
}

Но по понятным причинам я получаю ответ

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'bets.line_id' in 'on clause' (SQL: select `bets`.*, `lines`.`sport_id` as `laravel_through_key` from `bets` inner join `lines` on `lines`.`id` = `bets`.`line_id` where `lines`.`sport_id` = 1)

Если бы мне нужно было позвонить App\Sport::find(1)->bets, так как это предполагает связь между lines и bets в таблице bets, а не в таблице lines, как в настоящее время (я не могу изменить существующую структуру )

В любом случае можно ли получить все ставки на спорт по линиям $sport->bets

А затем, во-вторых, с этой настройкой, затем отсортировать все спорт у колонки ставок на столе ставок ? (в идеале по направлениям $sport->bets->orderBy('stake', 'desc')

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Есть два способа сделать это:

  1. Стремительная загрузка : где вы можете загрузить соотношение bet() между моделями line и bet , и вы можете сделать его эксклюзивным для определенного вида спорта с условием where return Line::with('bet')->where('sport_id',$sport_id)->get() $sport_id: это желаемый вид спорта. Недостаток - это дополнительные записи Строка , и результат не может быть упорядочен.

  2. Присоединиться с помощью QueryBuilder : Сделайте простое соединение между lines и bets с тем же условием, что и раньше, и включите заказ stake

    DB::table('lines')
        ->join('bets', 'lines.bet_id', '=', 'bet_id')
        ->select('lines.sport_id', 'bets.*')
        ->where('lines.sport_id',$sport_id)
        ->orderBy('bets.stake')
        ->get();
    

    Немного грязно, но здесь вы можете получить желаемый результат ( все ставки на спорт ).

0 голосов
/ 18 апреля 2020

Может быть, вы могли бы сделать что-то вроде:

public function bets()
{
    return Bet::where('id', $this->lines->pluck('bet_id'));
}
...