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.

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();

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
)

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();

5

Kode berikut berfungsi untuk saya:

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

            })
->get();

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.


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` = ?

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');
}

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();

0

menggunakan variabel

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

-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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.