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

Php Yii2-在整个activeRecords上调用模型函数?,php,activerecord,model,yii2,Php,Activerecord,Model,Yii2,我想做的事 我想使用活动模型查询一组特定的记录,如下所示 $jobModel = Jobs::find()->select('JOB_CODE')->distinct()->where(['DEPT_ID'=>$dept_id])->all(); 然后,我想根据这些记录是否出现在关系表中,为这个activerecord中的记录分配一个标志属性 我尝试过的 因此,在我的工作模型中,我声明了一个新属性incaccount。然后,我在作业模型中添加了此函数,该函数根据在

我想做的事

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

$jobModel = Jobs::find()->select('JOB_CODE')->distinct()->where(['DEPT_ID'=>$dept_id])->all();
然后,我想根据这些记录是否出现在关系表中,为这个activerecord中的记录分配一个标志属性

我尝试过的

因此,在我的工作模型中,我声明了一个新属性
incaccount
。然后,我在作业模型中添加了此函数,该函数根据在关系表中是否找到具有指定的
帐户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()
中进行数据库查询,那么如果数据库速度慢,这显然需要一些时间

我在寻找什么

我想知道是否有更有效的方法来完成这项工作,这样我就可以一次将
inccount
分配给所有的工作记录。我考虑过使用
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;
    }

看起来速度明显更快,因为它只需要一个查询。

您能解释一下为什么要添加这个标志吗?我使用的是一个yii小部件,它创建了一个双列表,给定了activerecord和一个标志属性(
inAccount
),并且flag属性将确定要放置模型的双列表的哪一侧。您可以使用select join来获取与查询匹配或不匹配的值。谢谢!现在似乎快了很多。使用direct命令总是比activeRecord(ORM)快..但是您可以使用与Matchin表的左联接来改进查询,在该表中,您可以指定一个值,而不可以在一个查询中指定另一个值