2015-06-09 5 views
1
$model = Item::find() 
->select('group_concat(item.ID) AS ItemID') 
->joinWith('image', true, 'LEFT JOIN') 
->where('item.user_id = :id', [':id' => Yii::$app->user->identity->ID]) 
->all(); 

Вы видите, если я, как это будет печататься мне строку Itemid с 145 элементов, разделенных запятой, но если есть 3000K записей в БД, так будет выводить меня только половина из них.PHP YII2 установить сеанс group_concat_max_len

Вопрос в том, есть ли можно установить сеанс group_concat_max_len в структуре Yii2?

ответ

1

Вы можете получить доступ к database connection объект вашего приложения с помощью Yii::$app->db. После этого вы можете установить переменную MySQL как раз перед вызовом find:

Yii::$app->db->createCommand('SET group_concat_max_len = $length')->execute(); 
$model = Item::find() 
... 

Для согласованности, вы можете установить group_concat_max_len в качестве параметра Yii в файле конфигурации, чтобы сделать его доступным приложение шириной.

'params' => [ 
    ... 
    'group_concat_max_len' => 50000, 
] 

Вы можете вызвать выше запрос с использованием

Yii::$app->db->createCommand(
    'SET group_concat_max_len = :length', [ 
     ':length' => Yii::$app->params['group_concat_max_len'] 
    ] 
)->execute(); 
+0

ТНХ, на самом деле не думал об этом –

1

Вы можете выполнить любой произвольный запрос с помощью рамки Yii2.

использовать что-то вроде этого для вашего вопроса:

// open connection to the DB 
$connection = new \yii\db\Connection([ 
    'dsn' => $dsn, 
    'username' => $username, 
    'password' => $password, 
]); 
$connection->open(); 

// Update the MySQL config 
$sql = 'SET group_concat_max_len = 50000;'; 
$connection->createCommand($sql)->execute(); 

Имейте в виду, что ответ DB по-прежнему будет обрезано, если длина селектов ответа больше, чем 50000 (в моем примере, выбрать, значение наилучшего для тебя).

Следует также знать, что эффективная максимальная длина возвращаемого значения ограничена значением max_allowed_packet вашего сервера MySQL.

Подробнее об этой конфигурации MySQL здесь: http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

0

, если вы использовали ActiveDataProvider, пожалуйста, попробуйте этот код:

$dataProvider = new ActiveDataProvider([ 
     'query' => $query, 



    ]); 
    $dataProvider->db->createCommand('SET group_concat_max_len = 1024*4')->execute(); 
Смежные вопросы