将左连接查询转换为 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();