Laravel 中不同的筛选条件要 join 不同的表,怎样优雅的实现?

代码还没写完,写到这就感觉太笨重了。

$list = DB::table('various_plan')
->leftJoin('user','various_plan.various_uid','=','user.user_id')
->leftJoin('user_card','various_plan.various_cid','=','user_card.card_id')
->leftJoin('various_plan_info','various_plan.various_id','=','various_plan_info.various_id')
->leftJoin('bank_list','user_card.card_bank_id','=','bank_list.list_id')
->select('various_plan.*','user.user_name','user_card.card_phone','various_plan_info.various_id',
    DB::raw("CONCAT_WS(':',cc_bank_list.list_name,cc_user_card.card_no) as bankinfo"))
->where($where)
->groupBy('various_plan_info.various_id')
->orderBy('various_plan.various_id','desc')
->paginate(15);

if($request->input('various_form_no')=='' && $request->input('plan_form_no')==''
&& $request->input('various_state')== 0 && $request->input('user_name')==''
&& $request->input('user_phone') == '' && $request->input('bank_id') == 0)
{
            $list_count = DB::table('various_plan')
                ->where($where)
                ->count();
}elseif($request->input('various_state')!= 0) {
            $list_count = DB::table('various_plan')
                ->where($where)
                ->count();
}elseif($request->input('bank_id') > 0){
            $list_count = DB::table('various_plan')
                ->leftJoin('user','various_plan.various_uid','=','user.user_id')
                ->leftJoin('user_card','various_plan.various_cid','=','user_card.card_id')
                ->leftJoin('bank_list','user_card.card_bank_id','=','bank_list.list_id')
                ->where($where)
                ->count();
}

$list = $list->toArray();

return json_encode(['status'=>0,'msg'=>'成功','total'=>$list_count,'data'=>$list]);
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5
nfangxu

以下代码仅供参考, 可以按照这个思路走

// 首先需要定义几个模型, User::class / UserCard::class / VariousPlanInfo::class
// VariousPlan 模型
class VariousPlan extends Model
{
    protected $appends = ['bank_info'];

    public function user() {
        return $this->belongsTo(User::class, 'various_uid', 'user_id');
    }

    public function userCard() {
        return $this->belongsTo(UserCard::class, 'various_cid', 'card_id');
    }

    public function variousPlanInfo() {
        return $this->hasOne(VariousPlanInfo::class, 'various_id', 'various_id');
    }

    public function getBankInfoAttribute() {
        return $this->userCard->bankList->list_name.":".$this->userCard->card_no;
    }
}

// UserCard 模型
class UserCard extends Model
{
    public function bankList()  {
        return $this->belongsTo(BankList::class, 'card_bank_id', 'list_id');
    }
}
// controller
$plans = VariousPlan::with([
    'user:user_name',
    'userCard',
    'variousPlanInfo:various_id',
])->where($where)->orderBy('various_id')->paginate(15);

return response()->json([
    'status' => 0,
    'msg' => '成功',
    'total' => $plans->total(),
    'data' => $plans->toArray(),
]);
4年前 评论
wanghan

我觉得有的时候没必要一条sql解决问题,分开写多好

4年前 评论
qq99589 (楼主) 4年前
nfangxu

以下代码仅供参考, 可以按照这个思路走

// 首先需要定义几个模型, User::class / UserCard::class / VariousPlanInfo::class
// VariousPlan 模型
class VariousPlan extends Model
{
    protected $appends = ['bank_info'];

    public function user() {
        return $this->belongsTo(User::class, 'various_uid', 'user_id');
    }

    public function userCard() {
        return $this->belongsTo(UserCard::class, 'various_cid', 'card_id');
    }

    public function variousPlanInfo() {
        return $this->hasOne(VariousPlanInfo::class, 'various_id', 'various_id');
    }

    public function getBankInfoAttribute() {
        return $this->userCard->bankList->list_name.":".$this->userCard->card_no;
    }
}

// UserCard 模型
class UserCard extends Model
{
    public function bankList()  {
        return $this->belongsTo(BankList::class, 'card_bank_id', 'list_id');
    }
}
// controller
$plans = VariousPlan::with([
    'user:user_name',
    'userCard',
    'variousPlanInfo:various_id',
])->where($where)->orderBy('various_id')->paginate(15);

return response()->json([
    'status' => 0,
    'msg' => '成功',
    'total' => $plans->total(),
    'data' => $plans->toArray(),
]);
4年前 评论

把公共的拎出来:

$query= DB::table('various_plan')
                ->leftJoin('user','various_plan.various_uid','=','user.user_id')
                ->leftJoin('user_card','various_plan.various_cid','=','user_card.card_id')
                ->leftJoin('bank_list','user_card.card_bank_id','=','bank_list.list_id');

// 后面该 if else

if(xxx) {
$query->anotherJoin();
}
$count = $query->count();
4年前 评论

你这么写也太累了,你可以把条件过滤一下再去执行sql。
把符合要求的条件统一塞到你的$where中,不符合的过滤掉,再去执行sql。

4年前 评论
颠倒的玉石

laravel为啥要db,这样的话和tp得写法有什么不同,又不是特别复杂的查询,只能sql。。。。。一个with就可以解决了,最多加个wherehas

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!