简体   繁体   中英

Union query to Laravel Eloquent query

Need Help to convert this query to laravel Eloquent Query

select `pin`.*,`pin_reviews`.`review`,( 3959 * acos( cos( radians('27.788870') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('72.978920') ) + sin( radians('27.788870') ) * sin( radians( lat ) ) ) ) AS distance,COUNT(`pin_reviews`.`pin_id`) as `totalUserRating`,SUM(`pin_reviews`.`rating`) / (COUNT(`pin_reviews`.rating * 5)) as `rating`,`ads`.`product_name`,`ads`.`id` as 'adId',`ads`.`notes`,`ads`.`add_status`,`ads`.`description` as 'adsDescription',`c`.`name` as 'catName',`c`.`id` as 'catId',`sc`.`id` as 'subcatId', `sc`.`name` as 'subName',`ssc`.`id` as 'SubsubId',`ssc`.`name` as 'subsubName' from ( 

  ( SELECT
        *
    FROM
        pin WHERE `subscription_plan` = 'Premium' LIMIT 2)
    UNION 
       ( SELECT
            *
        FROM
            pin WHERE `subscription_plan` = 'Platinum' LIMIT 1)
    UNION
        (SELECT
            *
            FROM pin WHERE `subscription_plan` = 'Free' LIMIT 10)
)

 AS pin
left join `pin_reviews` on `pin_reviews`.`pin_id` = `pin`.`id` left 
join `ads` on `ads`.`pin_id` = `pin`.`id` left join `category` as `c` 
on `c`.`id` = `ads`.`category_id` left join `category` as `sc` on 
`sc`.`id` = `ads`.`sub_category_id` left join `category` as `ssc` on 
`ssc`.`id` = `ads`.`sub_sub_category` where `pin`.`status` = 1 group 
by 
`pin`.`id` having `distance` < 380 order by `distance` asc limit 15

Laravel eloquent supports union() in which you make another query, but in this case it would be more simple to put all the query in a DB::selectRaw()

https://laravel.com/docs/5.6/queries#unions

https://laravel.com/docs/5.6/queries#raw-expressions

   $pinData =  Pin::select(
        DB::raw("`pin`.*,`pin_reviews`.`review`,( 3959 * acos( cos( 
    radians('$lat') ) * cos( radians( lat ) ) * cos( radians( lng ) - 
    radians('$lng') ) + sin( radians('$lat') ) * sin( radians( lat ) ) 
    ) ) 
  AS distance,COUNT(`pin_reviews`.`pin_id`) as
`totalUserRating`,SUM(`pin_reviews`.`rating`) / 
(COUNT(`pin_reviews`.rating * 5)) as 
`rating`,`ads`.`product_name`,`ads`.`id` as 
'adId',`ads`.`notes`,`ads`.`add_status`,`ads`.`description` as 
'adsDescription',`c`.`name` as 'catName',`c`.`id` as 'catId',`sc`.`id` 
as 'subcatId', `sc`.`name` as 'subName',`ssc`.`id` as 
'SubsubId',`ssc`.`name` as 'subsubName' " ));


$pinData->LeftJoin('pin_reviews','pin_reviews.pin_id','=', 
'pin.id');
    $pinData->LeftJoin('ads','ads.pin_id','=', 'pin.id');
    $pinData->LeftJoin('category as c','c.id','=', 'ads.category_id');
    $pinData->LeftJoin('category as sc','sc.id','=', 
'ads.sub_category_id');
    $pinData->LeftJoin('category as ssc','ssc.id','=', 
'ads.sub_sub_category');
    //$pinData->where('pin.status',1);
    $pinData->groupBy('pin.id');
    $pinData->Having('distance','<',1870);
$qcon    = '';
    // if search keyword 
    if($search!='')
    {
        $qcon.= " AND (pin.pin_name LIKE '%".$search."%'";
        $qcon.= " OR pin.name_on_map LIKE '%".$search."%'";
        $qcon.= " OR pin.description LIKE '%".$search."%'";
     }
    if($adStatus!='')
    {
            $qcon.= " AND ads.add_status='". $adStatus."' ";
    }


    $pinData->whereRaw('( 1 '.$qcon.')'); 
    $pinData->OrderBy('distance');
    $pinData->limit($search_settings->pins_appear_limit);
    $pins   = $pinData->get();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM