Bagaimana melakukan ini di Laravel, subquery where in

121

Bagaimana saya bisa membuat kueri ini di 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

Saya juga bisa melakukan ini dengan bergabung, tetapi saya membutuhkan format ini untuk kinerja.

Marc Buurke
sumber

Jawaban:

199

Pertimbangkan kode ini:

Products::whereIn('id', function($query){
    $query->select('paper_type_id')
    ->from(with(new ProductCategory)->getTable())
    ->whereIn('category_id', ['223', '15'])
    ->where('active', 1);
})->get();
lukaserat
sumber
1
Menerima jawaban ini, pertanyaan sudah kedaluwarsa karena tentang Laravel 3, dan jawaban yang masuk adalah untuk Laravel 4, jawaban di bawah ini akan berfungsi untuk 4 juga.
Marc Buurke
3
@lukaserat kueri yang dimaksud menerapkan DAN p. active= 1 periksa tabel produk sedangkan kueri Anda menerapkannya ke tabel ProductCategory .... kan ?? atau apakah ada sesuatu yang saya lewatkan ..?
hhsadiq
@hhsadiq ya, itu mengacu pada ProductCategory.
lukaserat
1
Pendekatan yang bagus dengan nama tabel. Ini nilai tambah bagi saya
Alwin Kesler
Bekerja dengan baik untuk laravel 5.5
Oleg Shakhov
53

Lihat dokumentasi lanjutan untuk Fluent: http://laravel.com/docs/queries#advanced-wheres

Berikut adalah contoh dari apa yang ingin Anda capai:

DB::table('users')
    ->whereIn('id', function($query)
    {
        $query->select(DB::raw(1))
              ->from('orders')
              ->whereRaw('orders.user_id = users.id');
    })
    ->get();

Ini akan menghasilkan:

select * from users where id in (
    select 1 from orders where orders.user_id = users.id
)
drewjoh
sumber
Itu hampir saja, dan saya telah bingung dengan pertanyaan serupa untuk beberapa waktu sekarang. Tapi where_in (laravel 3) membutuhkan 2 argumen, yang kedua adalah array. Ada ide bagaimana melakukannya dengan benar? Juga, saya tidak berpikir laravel 3 mendukung metode from.
Marc Buurke
Ah, Laravel3 ... Ya, itu akan sulit. Dan saya pikir di Laravel3 Anda menggunakan table()metode daripada from(). Saya belum pernah mengalami situasi itu di L3, maaf!
drewjoh
Saya tidak dapat melihat metode whereIn yang mengambil lambda di Illuminate \ Database \ Query \ Builder telah diganti namanya di manaSub?
nbransby
20

Anda dapat menggunakan variabel dengan menggunakan kata kunci "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();
Ramesh
sumber
5

Kode berikut berfungsi untuk saya:

$result=DB::table('tablename')
->whereIn('columnName',function ($query) {
                $query->select('columnName2')->from('tableName2')
                ->Where('columnCondition','=','valueRequired');

            })
->get();
Aditya Singh
sumber
3

Anda dapat menggunakan Eloquent dalam kueri yang berbeda dan membuatnya lebih mudah dipahami dan dikelola:

$productCategory = ProductCategory::whereIn('category_id', ['223', '15'])
                   ->select('product_id'); //don't need ->get() or ->first()

dan kemudian kami menggabungkan semuanya:

Products::whereIn('id', $productCategory)
          ->where('active', 1)
          ->select('id', 'name', 'img', 'safe_name', 'sku', 'productstatusid')
          ->get();//runs all queries at once

Ini akan menghasilkan kueri yang sama dengan yang Anda tulis di pertanyaan Anda.

Philipe
sumber
2

Skrip diuji di Laravel 5.x dan 6.x. The staticpenutupan dapat meningkatkan kinerja dalam beberapa kasus.

Product::select(['id', 'name', 'img', 'safe_name', 'sku', 'productstatusid'])
            ->whereIn('id', static function ($query) {
                $query->select(['product_id'])
                    ->from((new ProductCategory)->getTable())
                    ->whereIn('category_id', [15, 223]);
            })
            ->where('active', 1)
            ->get();

menghasilkan SQL

SELECT `id`, `name`, `img`, `safe_name`, `sku`, `productstatusid` FROM `products` 
WHERE `id` IN (SELECT `product_id` FROM `product_category` WHERE 
`category_id` IN (?, ?)) AND `active` = ?
Madan Sapkota
sumber
1

Laravel 4.2 dan yang lebih baru, dapat menggunakan kueri hubungan percobaan: -

Products::whereHas('product_category', function($query) {
$query->whereIn('category_id', ['223', '15']);
});

public function product_category() {
return $this->hasMany('product_category', 'product_id');
}
LC Yoong
sumber
0
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();
panqingqiang
sumber
0

menggunakan variabel

$array_IN=Dev_Table::where('id',1)->select('tabl2_id')->get();
$sel_table2=Dev_Table2::WhereIn('id',$array_IN)->get();
a3rxander
sumber
-2

Silakan coba alat online sql2builder ini

DB::table('products')
    ->whereIn('products.id',function($query) {
                            DB::table('product_category')
                            ->whereIn('category_id',['223','15'])
                            ->select('product_id');
                        })
    ->where('products.active',1)
    ->select('products.id','products.name','products.img','products.safe_name','products.sku','products.productstatusid')
    ->get();
cair207
sumber