Порядок красноречивых запросов Laravel по настраиваемым полям - PullRequest
0 голосов
/ 01 июня 2018

У меня есть этот необработанный запрос MySQL

SELECT campaign_influencers.*, 
   CASE influencer_status 
     WHEN 'PENDING' THEN 0 
     WHEN 'ACTIVE' THEN 1 
     WHEN 'LIVE' THEN 2 
     WHEN 'ACCEPTED' THEN 3 
     ELSE 5 
   end AS order_field 
FROM   campaign_influencers 
WHERE  campaign_id = 612 
ORDER  BY order_field 

Как это можно преобразовать в построитель красноречивых запросов?

Это то, что я сделал до сих пор.

 $sql = "SELECT campaign_influencers.*, 
               CASE influencer_status 
                 WHEN 'PENDING' THEN 3 
                 WHEN 'ACTIVE' THEN 1 
                 WHEN 'LIVE' THEN  2
                 WHEN 'ACCEPTED' THEN 0 
                 ELSE 5 
               end AS order_field 
            FROM   campaign_influencers 
            WHERE  campaign_id = :campaignId 
            ORDER  BY order_field";


 $campaignInfluencers = DB::select( DB::raw($sql), array(
        'campaignId' => $id
    ));

Проблема только в том, что объект отношения пропал.

foreach ($campaignInfluencers as $campaignInfluencer) {
    $user = $campaignInfluencer->user;    //will not work
}

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете сократить свой запрос, используя FIND_IN_SET

SELECT campaign_influencers.*, 
       FIND_IN_SET(influencer_status,'ACCEPTED,LIVE,ACTIVE,PENDING') AS order_field 
FROM   campaign_influencers 
WHERE  campaign_id = 612 
ORDER  BY order_field DESC

Используя eloquent @Jonas Staudenmeir, вы уже предложили использовать метод raw для необработанных выражений sql

YourModel::select('*', DB::raw("FIND_IN_SET(influencer_status,'ACCEPTED,LIVE,ACTIVE,PENDING') AS order_field"))
    ->where('campaign_id', 612)
    ->orderBy('order_field', 'desc')
    ->get();
0 голосов
/ 01 июня 2018

Используйте это:

CampaignInfluencer::select('*', DB::raw('CAST influencer_status ... AS order_field'))
    ->where('campaign_id', $campaign_id)
    ->orderBy('order_field')
    ->get();
...