Laravel вложенный WhereIn из нескольких таблиц - PullRequest
0 голосов
/ 27 марта 2019

Я использую Laravel 5.7. Как переписать приведенный ниже код в виде одного вложенного запроса?

В настоящее время я получаю результат, используя 2 запроса к базе данных. Я рассматриваю некоторые ответы в stackoverflow, но у меня все еще есть сомнения во вложении нескольких таблиц

  $connectedParts = DB::table('part_connections as c')
          ->join('parts_master as p', 'p.id', '=', 'c.part_number_id')
          ->where('c.part_number_id', $partId)
          ->where('p.id', $partId)
          ->pluck('connected_to');

  $connectedComponents = DB::table('part_connections as pc')
                            ->join('parts_master as pm', 'pm.id', '=', 'pc.connected_to')
                            ->where('part_number_id',$partId)
                            ->where('pm.part_type','1')
                            ->whereIn('connected_to', $connectedParts)
                            ->pluck('connected_to');

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 марта 2019

Сначала установите правильные отношения в вашей модели, затем попробуйте этот запрос:

//PartConnection model - add for eager loading
public function master() {
    return $this->belongsTo('PartMaster::class', 'connected_to', 'id');
}

$query = PartConnection::whereHas(‘master’, function($qry)) use ($partId) {
    $qry->where(‘parts_master.id’, $partId);
    $qry->where(‘parts_master.part_type’, 1);
});

$query->where(‘part_number_id’, $partId);

$connectedComponents = $query->get();

update

Попробуйте это тогда:

$connectedComponents = DB::table('part_connections as pc')
                        ->join('parts_master as pm', function($join) {
                            $join->on('pc.connected_to', '=', 'pm.id');
                            $join->on('pc.part_number_id', '=', 'pm.id');
                        }) //updated this - removed ;
                        ->where('part_number_id',$partId)
                        ->where('pm.part_type','1')
                        ->get();
...