将左连接查询转换为 Yii2 数据库活动记录
Convert left join query to Yii2 db active record
我有以下查询:
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 \yii\db\Expression('null')])
->with('user')
->all();
但是没用。我的数据库活动记录有什么问题?
看起来您想要做的是找到所有 karyawan
其 ID 未在 user
table.
中引用
我认为使用此查询您尝试做的事情会更容易:
$query = Karyawan::find()
->where([
'not in',
'id',
User::find()->select('id_karyawan')->column()
]
)
使用子查询查找 在用户 table:
中引用的所有 karyawan
ID
User::find()->select('id_karyawan')->column()
然后查找ID不在结果集的karyawan
:
where(['not in', id', $results])
如果 id
是您的主键,您将找不到任何东西,因为
->where(['is', 'karyawan.id', new \yii\db\Expression('null')])
也许你的意思是(查找所有 karyawan 为空的用户)
$query = User::find()
->where(['user.karyawan_id' => null])
->all();
或其他方式,如 raul 提到的:
$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();
我有以下查询:
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 \yii\db\Expression('null')])
->with('user')
->all();
但是没用。我的数据库活动记录有什么问题?
看起来您想要做的是找到所有 karyawan
其 ID 未在 user
table.
我认为使用此查询您尝试做的事情会更容易:
$query = Karyawan::find()
->where([
'not in',
'id',
User::find()->select('id_karyawan')->column()
]
)
使用子查询查找 在用户 table:
中引用的所有karyawan
ID
User::find()->select('id_karyawan')->column()
然后查找ID不在结果集的karyawan
:
where(['not in', id', $results])
如果 id
是您的主键,您将找不到任何东西,因为
->where(['is', 'karyawan.id', new \yii\db\Expression('null')])
也许你的意思是(查找所有 karyawan 为空的用户)
$query = User::find()
->where(['user.karyawan_id' => null])
->all();
或其他方式,如 raul 提到的:
$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();