2016-11-03 5 views
0

Я очень новичок в Laravel, и у меня проблемы с поиском запросов в Eloquent. У меня две модели - ноутбук и местоположение. Предположим, я хочу запросить все ноутбуки, принадлежащие местоположению, имеющему значение «запаса» 1. В SQL это будет левое соединение, но как это сделать в Eloquent? Я уже добавил отношения к двум моделям, поэтому модель ноутбука имеет метод «местоположения», но куда мне идти?Запросы поиска в Eloquent ORM

+1

Можете ли вы показать нам структуру таблицы и код вашей связи? – James

+0

да, пожалуйста, опубликуйте также свою структуру db – GiuServ

ответ

1

Для этого можно использовать области запросов. Они тщательно задокументированы в Laravel documentation

В модели ноутбука вы можете написать простор для stockcheck:

public function scopeInStock($query) 
{ 
    return $query->where('stock', 1); 
} 

держать его в чистоте, то вы можете создать еще одно соотношение в модели Расположение:

public function laptopsInStock() 
{ 
    return $this->hasMany('Laptop')->inStock(); 
    // or this way: 
    // return $this->laptops()->inStock(); 
} 

Теперь извлечь результаты есть несколько вариантов:

//all laptops 
$location->laptops; 

// in stock only 
$location->laptopsInStock; 

// eager loading 
$location->with('laptopsInStock')->get(); 
+0

Столбец «сток» находится в таблице мест, а не таблице ноутбуков. Это моя проблема - я хочу, чтобы все ноутбуки были из всех мест, где стоимость акций одна. – daninthemix

+0

Итак, все, что вам нужно: '$ laptops = Laptop :: inStock() -> get();' – trommelaap

+0

Не работает, я получаю 'Column not found: 1054 Unknown column 'stock' in 'where clause' ' – daninthemix

1

Поскольку вы не предоставили никакого кода, поэтому я опишу из основного.

Миграции

Местоположение Таблица

Schema::create('locations', function(Blueprint $table){ 
    $table->increments('id'); 
    $table->string('name'); 
    $table->timestamps(); 
}); 

ноутбуков Таблица

Schema::create('laptops', function(Blueprint $table){ 
    $table->increments('id'); 
    $table->string('name'); 
    $table->integer('location_id')->unsigned(); 
    $table->integer('stock'); 
    $table->timestamps(); 

    $table->foreign('location_id') 
      ->references('id') 
      ->on('locations') 
      ->onDelete('cascade') 
      ->onUpdate('cascade'); 
}); 

Модели

Местоположение Модель

class Location extends Model { 
    public function laptops(){ 
     return $this->hasMany('\App\Laptop'); 
    } 
} 

ноутбук Модель

class Laptop extends Model { 
    public function location(){ 
     return $this->belongsTo('\App\Location'); 
    } 
} 

Если вы создали приложение, как это, то есть несколько способов для достижения этой цели.
Это запросит весь ноутбук, принадлежащий местоположению, и имеет значение запаса 1.

1.

Laptop::where('location_id','some_location_id')->where('stock',1)->get(); 
Location::where('id','some_location_id')->with(['laptops' => function($query){ 
    $query->where('stock',1); 
}])->get(); 

Я надеюсь, что это позволит решить вашу проблему. Не стесняйтесь комментировать и задавать любой вопрос, который у вас есть.

+0

Спасибо за ответ. У меня нет внешнего ключа в миграции - у меня создалось впечатление, что достаточно описать атрибуты belongsTo и hasMany в моделях? В конечном счете, я хочу вернуть начальное представление, которое захватывает все ноутбуки из мест запаса, но этот запрос станет намного сложнее, позволяя пользователю фильтровать любую комбинацию модели, типа, местоположения и т. Д. У меня есть аналогичный -нормальные отношения с моделью. – daninthemix

+0

И просто добавить этот код в настоящее время '$ laptops = Laptop :: where ('stock', 1) -> get();' создает ошибку, не найденную в столбце. Изменить: для дальнейшего уточнения, я не хочу ограничивать результаты в определенном месте - мне нужны результаты из всех местоположений, имеющих значение запаса 1. И/или я хочу получить результаты от всех моделей ноутбуков, соответствующих выбору пользователя. – daninthemix

+0

Ошибка 'column not found' связана с тем, что вы пытаетесь получить доступ к столбцу, который не существует в таблице. – imrealashu

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