我有以下查询:
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()
]
)
使用子查询查找用户表中被引用的所有karyawan
ID:
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();