Yii2 - 在整个activeRecords上调用模型函数?

时间:2017-07-11 19:44:16

标签: php activerecord model yii2

我想做什么

我想使用活动模型查询一组特定的记录,如此

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

然后我想根据它们是否出现在关系表中来为此activerecord中的记录分配一个flag属性

我尝试了什么

所以在我的工作模型中,我已经声明了一个新属性inAccount。然后我在作业模型中添加了此函数,根据是否在具有指定inAccount

的关系表中找到记录,将account_id标志设置为-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()中进行数据库查询,那么如果数据库缓慢,这显然需要一些时间

我在寻找什么

我想知道是否有更有效的方法来做到这一点,这样我就可以一次为所有工作记录分配inAccount。我考虑使用afterFind(),但我认为这不会起作用,因为我需要指定一个特定的参数。我想知道是否有一种方法可以传递整个模型(或至少是模型/模型属性的数组,然后执行仅运行单个查询的所有分配。

我应该提一下,我确实需要最终使用原始的$jobModel activerecord

1 个答案:

答案 0 :(得分:0)

感谢scaisEdge的回答,我能够提出另一种解决方案,首先找到需要被标记的作业数组:

FOR /L %%A IN (1,1,300) DO (
     call pybot --output otput_%%A.html --log log_%%A.html --report report_%%A.html *.robot
)

然后检查每个作业记录以查看它是否出现在此数组中

    $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');

似乎明显更快,因为它只需要一个查询。