2016-09-23 3 views
-1

Я хочу получить все уникальные комбинации color_code.code и manufacturer_bundle.name, которые существуют. Они подключены через изготовителя столаСпособ фильтрации 2 столбцов для уникальных комбинаций! с laravel/eloquent

это мой текущий код.

$color_codes = ColorCode::select(['color_code.code', 'manufacturer_bundle.name'])->distinct() 
    ->leftJoin('manufacturer_bundle', 'color_code.manufacturer_id' , '=' , 'manufacturer_bundle.id') 
->get(); 

проблема с ним, в том, что в выберите возвращает только те поля, а не на самом деле модели. Поэтому я хочу, чтобы быть в состоянии сделать это:

$color_code->manufacturer->name 

, который дает мне

Попытка получить свойство необъектных

для полноты:

ColorCode:

Schema::create('color_code', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('code'); 
     $table->index('code'); 
     $table->integer('manufacturer_id'); 
     $table->index('manufacturer_id'); 
     $table->timestamps(); 
    }); 

Производитель

Schema::create('manufacturer', function (Blueprint $table) { 
     $table->bigIncrements('id'); 
     $table->string('name'); 
     $table->index('name'); 
     $table->integer('manufacturer_bundle_id')->nullable(); 
     $table->index( 'manufacturer_bundle_id'); 
     $table->timestamps(); 
    }); 
+0

посмотреть здесь http://stackoverflow.com/questions/11277251/selecting-distinct-2-columns-combination-in-mysql – Toskan

ответ

0

Только красноречивые объекты могут иметь отношения, а не коллекции.

Результаты вашего запроса - это коллекции, а не яркие объекты, потому что вы объединяете две таблицы. Поэтому, конечно, вы не можете «наследовать» модельные отношения для комбинаций данных. Вы должны создать новую модель для соединения цветовых кодов с производителями для того, чтобы работать, или найти ColorCode из указанного набора данных вручную:

$color_codes = ColorCode::select(['color_code.code', 'manufacturer_bundle.name'])->distinct() 
    ->leftJoin('manufacturer_bundle', 'color_code.manufacturer_id' , '=' , 'manufacturer_bundle.id') 
->get(); 

foreach ($color_codes as $color_data) { 
    $color_code = ColorCode::where('code', color_data->code)->first(); 
    echo $color_code->manufacturer->name; 
} 
+0

кроме этого быть неэффективным, это не будет работать. Потому что уникальное ограничение комбинации не заполнено – Toskan

0

Я думаю, что вы можете использовать hasManyThrough отношений. Laravel Has Many Through

В вашей модели ColorCode добавьте следующий метод для определения hasManyThrough. Примечание: Предполагая, что у вас есть ManufacturerBundle модель для таблицы manufacturer_bundle и Manufacturer для manufacturer стол.

public function manufacturer_bundle(){ 
    return $this->hasManyThrough(ManufacturerBundle::class,Manufacturer::class); 
} 

Теперь в вашем контроллере вы можете использовать следующий метод для извлечения manufacturer_bundle.

$color_codes = ColorCode::with('manufacturer_bundle')->get(); 
+0

, а как насчет результатов, которые нужно отличать? которые должны быть уникальными комбинациями. – Toskan

+0

@Toskan jsu add 'distinct()' method – jaysingkar

Смежные вопросы