Простой implode()
может открыть для вас SQL-инъекцию - вы должны экранировать значения перед их развертыванием:
$friendlist = array_map(function ($data) {
return Yii::$app->db->quoteValue($data);
}, $friendlist);
$query->select([
'trans_type' => new \yii\db\Expression(
'CASE WHEN (u1.user_id = u2.user_id) THEN "Added"
ELSE (
CASE WHEN (u1.user_id IN (' . implode(',', $friendlist) . ')) THEN "Paid"
ELSE "Received" END
) END'
),
]);
Или вы можете использовать QueryBuilder
и InCondition
- этобудет использовать подготовленные операторы и параметры для построения IN
оператора:
$params = [];
$condition = Yii::$app->db->queryBuilder
->buildCondition(new InCondition('u1.user_id', 'IN', $friendlist), $params);
$query->select([
'trans_type' => new \yii\db\Expression(
'CASE WHEN (u1.user_id = u2.user_id) THEN "Added"
ELSE (
CASE WHEN (' . $condition . ') THEN "Paid"
ELSE "Received" END
) END',
$params
),
]);