2017-02-21 74 views
1

Я прочитал this сообщение, которое помогло, но вам нужно больше руководства, пожалуйста.Laravel 5.3 eloquent 3 соединение таблицы с использованием моделей

Мне нужен набор результатов для конкретного $batteryid (на результат) и конкретный $age (на тестовой модели) и конкретный $gender (от спортсмена). Каждый тест принадлежит одному спортсмену. Каждый тест имеет много результатов.

Модель батареи:

class Battery extends Model{ 
    public function results(){ 
     return $this->hasMany('App\Result'); 
    }  
} 

Модель Результат:

class Result extends Model{ 
    public function test(){ 
     return $this->belongsTo('App\Test', 'test_id'); 
    } 

    public function battery(){ 
     return $this->belongsTo('App\Battery', 'battery_id'); 
    }  
} 

тест Модель:

class Test extends Model{ 
    public function athlete(){ 
     return $this->belongsTo('App\Athlete', 'athlete_id'); 
    } 

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

я получить правильные результаты с следующий, но это два запроса:

$tests = Test::whereHas('Athlete', function($query) use($gender){ 
       $query->wheregender($gender); 
      })->where('age', $age)->get(); 

$test_ids = $tests->pluck('id'); 
$results = Result::where('battery_id', '=', $battery) 
      ->whereIn('test_id', $test_ids) 
      ->get(); 

Я бы хотел использовать модельный подход, но я полностью застрял. test.age не признан и не уверен, как получить возраст от модели спортсмена. Моя попытка:

  $results = Result::with('test') 
      ->where('test.age', '=', $age) 
      ->join('batteries', 'batteries.id', '=', 'test.battery_id') 
      //->where('test->athlete().gender', '=' $gender) 
      ->where('battery_id', '=', $battery) 
      ->get(); 

ответ

1

Вы можете использовать whereHas для условия и with метод нетерпеливой загрузки.

$results = Result::whereHas('test', function($q) use ($age) { 
      $q->where('age', '=', $age); 
      $q->whereHas('athlete', function ($q) { 
       $q->where('gender', 'male'); 
      }); 

     }) 
     ->with('test') 
     ->whereHas('battery', function($q) use($battery) { 
      $q->where('battery_id', '=', $battery); 
     }) 
     ->with('battery') 
     ->get(); 
+0

Он работал до того, как вы добавили пол. Теперь я тестирую другой синтаксис, возможно, должен выйти второй $ q->? – louisav

+0

Стоит ли таблица вашего атлета получить гендерный столбец? – geckob

+0

Если вы используете переменную gender, вам необходимо включить ее в закрытие функции. – geckob