簡體   English   中英

Yii2-在整個activeRecords上調用模型函數嗎?

[英]Yii2 - Calling model functions on entire activeRecords?

我要做什么

我想使用像這樣的活動模型查詢一組特定的記錄

$jobModel = Jobs::find()->select('JOB_CODE')->distinct()->where(['DEPT_ID'=>$dept_id])->all();

然后,我想根據它們是否出現在關系表中為該activerecord中的記錄分配一個標志屬性

我嘗試過的

因此,在我的工作模型中,我在inAccount聲明了一個新屬性。 然后,我在作業模型中添加了此函數,該模型根據是否在關系表中找到具有指定account_id的記錄,將inAccount標志設置為-1或0

public function assignInAccount($account_id){
    if(JobCodeAccounts::find()->where(['JOB_CODE'=>$this->JOB_CODE])->andWhere(['ACCOUNT_ID'=>$account_id])->one() == null){
        $this->inAccount=0;
    }
    else{
        $this->inAccount = -1;
    }
}

我一直在做的是像這樣單獨使用foreach分配每個值

foreach($jobModel as $job){
    $job->assignInAccount($account_id);
}

但是,這顯然很慢,因為如果我在$jobModel有大量記錄,並且每個記錄都在assignInAccount()進行數據庫查詢, assignInAccount()如果數據庫很慢,這顯然會花費一些時間。

我在尋找什么

我想知道是否有更有效的方法來執行此操作,以便我可以一次將inAccount分配給所有作業記錄。 我考慮過使用afterFind()但是我認為這不起作用,因為我需要指定一個特定的參數。 我想知道是否有一種方法可以傳遞整個模型(或至少傳遞模型/模型屬性數組,然后執行僅在單個查詢中進行的所有分配)。

我應該提一下,我確實需要以原始的$jobModel activerecord結尾

感謝scaisEdge的回答,我得以提出一個替代解決方案,首先找到需要標記的作業陣列,如下所示:

    $inAccountJobs = array_column(Yii::$app->db->createCommand('Select * from job_code_accounts where ACCOUNT_ID = :account_id')
        ->bindValues([':account_id' => $account_id])->queryAll(), 'JOB_CODE');

然后檢查每個作業記錄以查看它是否出現在此數組中,如下所示

    foreach($jobModel as $job){
        if(in_array($job->JOB_CODE, $inAccountJobs))
            $job->inAccount = -1;
        else
            $job->inAccount = 0;
    }

似乎確實要快得多,因為它只需要單個查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM