2015-12-14 5 views
1

Я пытаюсь создать функцию поиска в php с Slim и Eloquent 5.1, но у меня есть проблема с получением результатов из базы данных. Это мои таблицыEloquent Multitable query

 
Listing Table 
    id | title | description | price | size |etc... 
-----|--------|-------------|-------|--------|------- 
    1 | list1 | some text | 500 | 50 | 
    2 | list2 | some text | 700 | 80 | 
    3 | list3 | some text | 350 | 120 | 

Listings Option Table 
    id | id_listing | opt_name | opt_value 
-----|-------------|-------------|---------- 
    1 |  1  | rooms  | 3 
    2 |  1  | baths  | 4 
    3 |  2  | rooms  | 8 
    4 |  3  | baths  | 1 
    5 |  3  | rooms  | 6 

Listings Images Table 
    id | id_listing | file_name 
-----|-------------|------------- 
    1 |  1  | file_1.png  
    2 |  1  | file_2.png  
    1 |  2  | file_3.png  
    2 |  3  | file_4.png  

Теперь я нашел способ, чтобы получить все результаты со всеми они вариантами с

listado = $app->listing->with(['options'],['imgs'])->get(); 

Моих классами

//Listing Class 

class Listing extends Eloquent{ 
    protected $table = 'listings'; 


    public function options(){ 
    return $this->hasMany('Casas\Listing\ListingOption', 'id_listing', 'id'); 
    } 

    public function imgs(){ 
    return $this->hasMany('Casas\Listing\ListingImg', 'id_listing'); 
    } 

} 

// ListingOption class 

class ListingOption extends Eloquent{ 
    protected $table = 'listings_options'; 

    public function listings() 
    { 
    return $this->belongsTo('Casas\Listing\Listing', 'id_listing'); 
    } 

} 

// ListingImg Class 
class ListingImg extends Eloquent{ 
    protected $table = 'listings_imgs'; 

    public function listings() 
    { 
    return $this->belongsTo('Casas\Listing\Listing', 'id_listing'); 
    } 

} 

, но я не могу найти способ отфильтруйте запрос так, как я хочу. Я много пробовал.

Пример: Я хочу получить все листинги с ценой менее 600 и иметь более 2 комнат.

Так что быть листинг идентификатор 1 и 3

Если кто-то может помочь создать этот запрос, я буду ценить это.

ответ

3

Что вы хотите использовать, это whereHas.

При обращении к записи для модели, вы можете ограничить результаты, основанные на существовании отношений

$result = $app->listing->with('options', 'imgs') 
    ->whereHas('options', function ($query) { 
     $query->where('opt_value', '>', 2) 
      ->where('opt_name', 'room'); 
    }) 
    ->where('price', '<', 600)->get(); 

Так что мы делаем здесь, жадная загрузка варианты и imgs таблицы и выбор только листингов, имеющих хотя бы один вариант, где opt_value больше двух и имя-опт Номер номер.

Вы можете найти больше информации о запросах отношений в here

+0

Спасибо большое, я немного изменил это и получил, что он работает точно так, как я хотел t о. Большое спасибо @FabioAntunes – abonive

+0

@abonive Я рад, что помог вам! –

0

Я хотел бы попробовать что-то вроде этого:

$result = $app->listing->with(
    ['options' => function ($query) { 
     $query->where('opt_value', '>', 2); 
     } 
    ], 
    ['imgs'])->where('price', '<', 600)->get(); 

Последний, внешний where должен быть назначен listing. Внутренний where, переданный в обратном вызове, должен быть назначен непосредственно options.

Посмотрите на docs (раздел «Ограничивающие грузы»).

+0

Я попробовал, что я, но первый, с этим где в опции я не знаю, если он смотрит на опционной комнате или баню и ее возвращении оба. И он возвращает списки, у которых также нет параметров. – abonive

+0

Похоже, вам нужно еще больше ограничить результат. Вы можете просто связать другие '-> where()' clauses, чтобы получить именно то, что вам нужно. – lesssugar

+0

я пытался что-то вроде этого '$ listado = $ app-> listing-> с ( \t [ 'опции' => функция ($ запроса) { \t $ query-> где ('opt_name', '' номера) -> где ('значение', '>', 2); \t} \t], \t [ 'ГИМ']) -> где ('цена', '<', 600)-> прибудете(); ' но не working – abonive