Как передать массив в случае, когда - PullRequest
0 голосов
/ 30 мая 2018

Я хочу передать массив в операторе CASE WHEN

$friendlist = [];
    foreach ($data as $datas) 
    {
        if ($datas['friend_one'] == $id) 
        {
            $friendlist[] = $datas['friend_two'];
        }
        else
        {
            $friendlist[] = $datas['friend_one'];
        }
    }

$query->select('(CASE WHEN (u1.user_id = u2.user_id) THEN "Added" ELSE (CASE WHEN (u1.user_id = '.$friendlist.') THEN "Paid" ELSE "Received" END) END) as trans_type')

для одного значения в порядке, но когда я передаю массив, он выдает ошибку «Преобразование массива в строку».любое решение, как передать массив.

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Простой 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
    ),
]);
0 голосов
/ 30 мая 2018

Сначала вставьте $friendlist array в строку через запятую, а затем передайте ее в IN function.Пожалуйста, попробуйте это.

$friendlist = [];
    foreach ($data as $datas) 
    {
        if ($datas['friend_one'] == $id) 
        {
            $friendlist[] = $datas['friend_two'];
        }
        else
        {
            $friendlist[] = $datas['friend_one'];
        }
    }
$friendlist = implode(",",$friendlist);//implode array into comma separated string

$query->select('(CASE WHEN (u1.user_id = u2.user_id) 
    THEN "Added" ELSE (CASE WHEN (u1.user_id IN ('.$friendlist.')) 
    THEN "Paid" ELSE "Received" END) END) as trans_type');
0 голосов
/ 30 мая 2018
$friendlist = [];
foreach ($data as $datas) 
{
    if ($datas['friend_one'] == $id) 
    {
        $friendlist[] = $datas['friend_two'];
    }
    else
    {
        $friendlist[] = $datas['friend_one'];
    }
}
foreach($friendlist as $value){

$query->select('(CASE WHEN (u1.user_id = u2.user_id) THEN "Added" ELSE (CASE WHEN (u1.user_id = '.$value.') THEN "Paid" ELSE "Received" END) END) as trans_type')
}
0 голосов
/ 30 мая 2018

Вы не можете сравнивать массив со строкой или наоборот, сначала вы должны внедрить ваш массив в строку, а затем использовать в IN:

попробуйте это:

$query->select(
  '(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) as trans_type');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...