将左侧联接查询转换为Yii2db活动记录



我有以下查询:

SELECT karyawan.* FROM karyawan LEFT JOIN user ON user.id_karyawan = karyawan.id WHERE user.id_karyawan IS NULL

我使用的数据库活动记录如下:

$query = Karyawan::find()
->select('*')
->leftJoin('user', 'user.id_karyawan = karyawan.id')
->where(['is', 'karyawan.id', new yiidbExpression('null')])
->with('user')
->all();

但它不起作用。我的数据库活动记录出了什么问题?

看起来您要做的是查找user表中未引用其ID的所有karyawan

我认为,使用以下查询,您尝试做的事情会更容易:

$query = Karyawan::find()
->where([
'not in',  
'id', 
User::find()->select('id_karyawan')->column()
]
)

使用子查询查找用户表中引用的所有karyawanID:

User::find()->select('id_karyawan')->column()

然后找到ID不在结果集中的karyawan

where(['not in', id', $results])

如果id是您的主键,则由于,您将找不到任何内容

->where(['is', 'karyawan.id', new yiidbExpression('null')])

也许你的意思是(找到所有拥有空karyawan的用户(

$query = User::find()
->where(['user.karyawan_id' => null])
->all();

或者其他方式,就像罗提到的:

$query = Karyawan::find()
->where([
'not in',  
'id', 
User::find()->select('id_karyawan')->column()
]
)

关于查询构建的评论:

$query = Karyawan::find()
// ->select('*') // you can skip this
// ->leftJoin('user', 'user.id_karyawan = karyawan.id') // this is done by 'joinWith'
->joinWith('user') // instead 'with', eager loading (LEFT JOIN), no extra selects on demand
->where(['karyawan.user_id' => null]) // shorter syntax
->all();

相关内容

  • 没有找到相关文章

最新更新