dongyuan9109 2018-06-22 09:41
浏览 155
已采纳

如何在Laravel查询构建器中编写子查询

i have an mssql query that looks like this:

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

i converted the inner select into Laravel query builder

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

and this is working. But now how can i get the

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

convert to my query builder. sure i could use ->select() and write the raw sql query but i need this in the query builder because my inner and outer where clause i optional

  • 写回答

1条回答 默认 最新

  • dqq46733 2018-06-22 10:10
    关注

    I guess you could simplify your query as below, there is not need for sub query

    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)
    

    In query builder you can use Parameter Grouping

    \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();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退