Larvel SQL Query Возвращает дубликаты

Я пытаюсь увеличить скорость моего запроса Laravel 5.4 sql, используя соединения, которые я никогда раньше не использовал. В настоящее время у меня есть запрос на работу и возвращение результатов, моя проблема в том, что я получаю как каждый результат около 8 раз. Пример: я получаю то же 2001 Chevrolet Silverado 8 раз в моем массиве. Если бы кто-нибудь мог мне помочь, я бы очень признателен. Спасибо

Мой запрос + коллекция:

$tmp = DB::table('inventories'
            )->join(
                'vehicles', 'vehicles.id', '=', 'inventories.id'
            )->join(
                'vimages', 'vimages.vehicle_id', '=', 'inventories.id'
            )->where(
                'inventories.dealer_id', '=', $dealer_id
            )->where(
                'inventories.is_active', '=', 1
            )->where(
                'inventories.is_deleted','=', 0
            )->select(
                'inventories.stock_number','inventories.vehicle_id','vehicles.year','vehicles.make','vehicles.model','vehicles.vin','inventories.vehicle_status',
                'inventories.cost','inventories.search_meta','vimages.name'
        );


        $data = collect();
        $pmt = $tmp->get();
        // return json_encode( $pmt );

        // logger( sprintf('# of rows returned: %s', $pmt->count() ) );

        $pmt->each( function($row) use(&$data) {
          // logger( sprintf('Row    : %s', $row->toJson() ));

            $data->push( array(
                'stock_number' => $row->stock_number,
                'vehicle_id' => $row->vehicle_id,
                'year' => $row->year,
                'make' => $row->make,
                'model' => $row->model,
                // 'trim' => $row->trim,
                'vin' => $row->vin,
                'status' => $row->vehicle_status,
                // 'purchase_price' => $row->purchase_price,
                'cost' => $row->cost,
                // 'retail_price' => $row->retail_price,
                'search_meta' => $row->search_meta,
                // 'images' => $row->getFirstImage()
                'images' => $row->name
                // 'interior_color' => $row->vehicle()->first()->interior_color,
                // 'exterior_color' => $row->vehicle()->first()->exterior_color,
                // 'firstImg' => $row->getFirstImage()
                // 'images' => Vimage::select('vehicle_id','name'
                //                 )->where(
                //                     'dealer_id', '=', $row->dealer_id
                //                 )->where(
                //                     'vehicle_id', '=', $row->vehicle_id
                //                 )->limit(1)->get()
            ));

        });

Пример моего массива: https://i.imgur.com/FOphST8.png

1
задан 13 August 2018 в 15:49

3 ответа

Это звучит тривиально, но это должно работать:

$tmp = DB::table('inventories'
        )->join(
            'vehicles', 'vehicles.id', '=', 'inventories.id'
        )->join(
            'vimages', 'vimages.vehicle_id', '=', 'inventories.id'
        )->where(
            'inventories.dealer_id', '=', $dealer_id
        )->where(
            'inventories.is_active', '=', 1
        )->where(
            'inventories.is_deleted','=', 0
        )->selectRaw("DISTINCT inventories.stock_number, inventories.vehicle_id, 
            vehicles.year, vehicles.make, vehicles.model, vehicles.vin, 
            inventories.vehicle_status, inventories.cost, 
            inventories.search_meta, vimages.name"
    );

Обновление: забыл удалить одинарные кавычки в selectRaw

0
ответ дан 15 August 2018 в 16:59
  • 1
    Спасибо, мне удалось решить эту проблему. Я отправил свой ответ выше. – ImJT 13 August 2018 в 16:28

Понял это благодаря @Devon. Добавлен другой оператор where для запроса, чтобы получить только первое изображение.

Спасибо

)->where('vimages.sequence','=', 0
0
ответ дан 15 August 2018 в 16:59

Я не вижу вашу таблицу db, но я думаю, что есть проблема в первом статусе объединения: вы должны использовать

->join('vehicles', 'vehicles.id', '=', 'inventories.vehicle_id' )

вместо

->join('vehicles', 'vehicles.id', '=', 'inventories.id' )

и второе соединение должен быть как

->join('vimages', 'vimages.vehicle_id', '=', 'vehicles.id')

вместо

->join('vimages', 'vimages.vehicle_id', '=', 'inventories.id')
1
ответ дан 15 August 2018 в 16:59
  • 1
    Спасибо. Однако в таблице инвентаря нет транспортного средства. Идентификатор кадастров коррелирует с транспортным средством таблиц . – ImJT 13 August 2018 в 16:21

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

Похожие вопросы: