Как я могу сделать этот запрос в Laravel:
SELECT `p`.`id`, `p`.`name`, `p`.`img`, `p`.`safe_name`, `p`.`sku`, `p`.`productstatusid` FROM `products` p WHERE `p`.`id` IN ( SELECT `product_id` FROM `product_category` WHERE `category_id` IN ('223', '15') ) AND `p`.`active`=1
Я мог бы также сделать это с помощью соединения, но мне нужен этот формат для производительности.
Рассмотрим этот код:
Products::whereIn('id', function($query){ $query->select('paper_type_id') ->from(with(new ProductCategory)->getTable()) ->whereIn('category_id', ['223', '15']) ->where('active', 1); })->get();
Взгляните на расширенную документацию для Fluent: http://laravel.com/docs/queries#advanced-wheres
Вот пример того, что вы пытаетесь достичь:
DB::table('users') ->whereIn('id', function($query) { $query->select(DB::raw(1)) ->from('orders') ->whereRaw('orders.user_id = users.id'); }) ->get();
Это даст:
select * from users where id in ( select 1 from orders where orders.user_id = users.id )
Вы можете использовать переменную, используя ключевое слово "use ($ category_id)"
$category_id = array('223','15'); Products::whereIn('id', function($query) use ($category_id){ $query->select('paper_type_id') ->from(with(new ProductCategory)->getTable()) ->whereIn('category_id', $category_id ) ->where('active', 1); })->get();
Следующий код работал для меня:
$result=DB::table('tablename') ->whereIn('columnName',function ($query) { $query->select('columnName2')->from('tableName2') ->Where('columnCondition','=','valueRequired'); }) ->get();
Laravel 4.2 и более поздние версии, могут использовать запрос отношения try:
Products::whereHas('product_category', function($query) { $query->whereIn('category_id', ['223', '15']); }); public function product_category() { return $this->hasMany('product_category', 'product_id'); }
Product::from('products as p') ->join('product_category as pc','p.id','=','pc.product_id') ->select('p.*') ->where('p.active',1) ->whereIn('pc.category_id', ['223', '15']) ->get();