将左连接的mysql查询转换为Eloquent

时间:2019-08-01 06:27:33

标签: mysql laravel eloquent

我有一个这样的mysql查询:

select result.*, rank_text.text
from  cache_user_challenge_result result
left join rank_text on result.rank
between rank_text.rank_from and rank_text.rank_to

现在,对于我的laravel项目,我想将其更改为雄辩的,我尝试了一下,但它不起作用:

$this->select(
                        "{$this->table}.user_id",
                        'rank_text.text'
                    )
                    ->leftJoin('rank_text', "{$this->table}.rank")
                    ->whereBetween("{$this->table}.rank", ['rank_text.rankFrom', 'rank_text.rankTo'])
                    ->first();

你能告诉我这是怎么回事吗?

非常感谢您!

更新:

很多小时后,我将查询更改为此:

$this->select(
                        "{$this->table}.user_id",
                        'rank_text.text'
                    )
                    ->leftJoin('rank_text', function($query) {
                        $query->whereBetween("{$this->table}.rank", ['rank_text.rank_from', 'rank_text.rank_to']);
                    })
                    ->get();

但是只能获取user_id,而不能获取文本。

1 个答案:

答案 0 :(得分:0)

尝试创建像

这样的cache_user_challenge_result模型
class CacheUserChallengeResult extends Model {
    protected $table = 'cache_user_challenge_result';
    public function scopeGetCacheUserRank()
    {
       return static::select(DB::raw('cache_user_challenge_result.*,rank_text.text'))->leftJoin('rank_text', function($join) {
  $join->on('cache_user_challenge_result..rank', '=', 'rank_text.rank')->whereBetween('cache_user_challenge_result.rank',['rank_text.rankFrom', 'rank_text.rankTo']);
});
    }
 }

在Controller中,您可以这样调用

CacheUserChallengeResult::getCacheUserRank()->get();

它将为您提供所需排名的集合,您还可以传递范围内想要的排名的参数