tp6通過閉包方式連表查詢的問題


業務背景:

最近在做龍巔廣告系統,使用了新的tp6框架

 

相關數據結構:

advert_plan 廣告計划表

advert_plan_position 廣告計划位置表

這兩個表示 計划表和位置表是 1:n

 

需求:

在計划列表中的信息已經是包含跨表信息,其中就有位置表里的信息,那該怎么做呢?

/**
 * 廣告計划表
 * Class AdvertPlan
 * @package app\common\model
 * @author:hann
 * @time:2020-03-10
 */
namespace app\common\model;

class AdvertPlan extends Common {
    
    protected $pk = 'plan_id';

    /**
     * 位置關聯模型 1對n
     * User: feng
     * Date: 2020-03-14
     * @return \think\model\relation\HasMany
     */
    public function planPosition() {
        return $this->hasMany(AdvertPlanPosition::class, 'plan_id', 'plan_id');
    }
}

  

寫了 在Plan表的model里寫關聯模型planPosition方法

然后執行查詢如下

        //連表查詢
        $data = $model_plan->with(['planPosition'])
            ->field('*')
            ->where($where)
            ->order('plan_id')
            ->paginate();
        echo $model_plan->getLastSql();
        dd($data->toArray());

這樣連表查詢是沒問題的。

 

但問題來了,根據需求,【要根據位置來篩選計划】,那就得設置位置表的where條件唄,代碼如下:

    //連表查詢,異常
        //haswhere 關聯表查詢失敗!
        $data = $model_plan->with(['planPosition'])
            ->field('*')
            ->where($where)
            ->hasWhere('planPosition',['position'=>1])
            ->order('plan_id')
            ->paginate();
        echo $model_plan->getLastSql();
        dd($data->toArray());

 問題來了,提示報錯:

#0 [10501]PDOException in PDOConnection.php line 722
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'AdvertPlan.plan_id' in 'on clause'

 

 

錯誤原因:

with不能與hasWhere連用,必須使用with閉包的形式才能實現子模型的條件篩選,具體如下:

       //連表查詢
        $data = $model_plan->with(
            [
                'planPosition'	=> function($query) {
                    if(!empty($where_position)){
                        $query->where($where_position);
                    }
                },
            ])
            ->field('*')
            ->where($where)
            ->order('plan_id')
            ->paginate();
        echo $model_plan->getLastSql();
        dd($data->toArray());

  

 

 

 

author:hann

手冊鏈接:https://www.kancloud.cn/manual/thinkphp6_0/1037600

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM