簡體   English   中英

如何在Laravel查詢構建器中編寫子查詢

[英]How to write a subquery in Laravel query builder

我有一個看起來像這樣的mssql查詢:

SELECT * FROM (

    SELECT a.Client, ad.Kto, a.Address, a.Matchcode, a.Name1, a.country, a.ZIP, a.Street FROM [HeadQuarter].[dbo].[Addresses] a
            INNER JOIN [HeadQuarter].[dbo].[AddressesDetails] ad ON (a.Client = ad.Client AND 
                                                                 a.Address = ad.Address)

    WHERE ad.Active <> 0 AND
          (a.USER_emailactive = 0 OR a.USER_emailactive IS NULL)

) client_id

WHERE (a.Country = 'AT' AND a.ZIP BETWEEN '0000' AND '5000')

我將內部選擇轉換為Laravel查詢生成器

\DB::connection('sqlsrv')
->table('[HeadQuarter].[dbo].[Addresses]')
->join([HeadQuarter].[dbo].[AddressesDetails], function($join){

$join->on('[HeadQuarter].[dbo].[Addresses].Client', '=', '[HeadQuarter].[dbo].[AddressesDetails].Client')
     ->on('[HeadQuarter].[dbo].[Addresses].Address', '=', '[HeadQuarter].[dbo].[AddressesDetails].Address')

})
->select('[HeadQuarter].[dbo].[Addresses].Client, [HeadQuarter].[dbo].[AddressesDetails].Kto,....')
->where('[HeadQuarter].[dbo].[AddressesDetails].Active', '<>', '0')
->whereRaw('(a.USER_emailactive = 0 OR a.USER_emailactive IS NULL)')
->get();

這正在工作。 但是現在我該如何獲得

SELECT * FROM (..inner query..) client_id 
WHERE (a.Country = 'AT' AND a.ZIP BETWEEN '0000' AND '5000')

轉換為我的查詢生成器。 確保我可以使用-> select()並編寫原始sql查詢,但是我需要在查詢生成器中使用它,因為我的內部和外部where子句我是可選的

我想你可以如下簡化查詢,不需要子查詢

SELECT a.Client, ad.Kto, a.Address, a.Matchcode, a.Name1, a.country, a.ZIP, a.Street 
FROM [HeadQuarter].[dbo].[Addresses] a
INNER JOIN [HeadQuarter].[dbo].[AddressesDetails] ad 
ON (a.Client = ad.Client AND a.Address = ad.Address)
WHERE ad.Active <> 0 
    AND a.Country = 'AT' 
    AND a.ZIP BETWEEN '0000' AND '5000'
    AND (a.USER_emailactive = 0 OR a.USER_emailactive IS NULL)

在查詢構建器中,您可以使用參數分組

\DB::connection('sqlsrv')
    ->table('[HeadQuarter].[dbo].[Addresses] as a')
    ->join('[HeadQuarter].[dbo].[AddressesDetails] as b', function($join){
        $join->on('a.Client', '=', 'ad.Client')
             ->on('a.Address', '=', 'ad.Address');

    })
    ->select('a.Client', 'ad.Kto', 'a.Address', 'a.Matchcode', 'a.Name1', 'a.country', 'a.ZIP', 'a.Street')
    ->where('ad.Active', '<>', '0')
    ->where(function ($query) {
        $query->whereNull('a.USER_emailactive')
              ->orWhere('a.USER_emailactive', '=', '0');
     })
     ->where(function ($query) {
        $query->orWhere(function ($query) {
            $query->where('a.Country', '<>', 'AT')
                  ->whereBetween('a.ZIP', ['0000', '5000']);
        })->orWhere(function ($query) {
            $query->where('a.Country', '<>', 'Foo')
                  ->whereBetween('a.ZIP', ['0000', '5000']);
        })->orWhere(function ($query) {
            $query->where('a.Country', '<>', 'Bar')
                  ->whereBetween('a.ZIP', ['0000', '5000']);
        });
    })
    ->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM