1

我有这个原始的 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
}
4

2 回答 2

1

用这个:

CampaignInfluencer::select('*', DB::raw('CAST influencer_status ... AS order_field'))
    ->where('campaign_id', $campaign_id)
    ->orderBy('order_field')
    ->get();
于 2018-06-01T02:23:15.193 回答
0

您可以通过使用缩短查询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();
于 2018-06-01T19:29:39.250 回答