PHP YII2 设置会话group_concat_max_len

PHP YII2 set session group_concat_max_len

$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个元素用逗号分隔,但是如果db中有3000k条记录, 所以它只会输出其中的一半。

问题是,是不是 可以在 Yii2 框架中设置会话 group_concat_max_len?

您可以使用 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();

请注意,如果您的 SELECT 响应长度大于 50000(在我的示例中,请选择最适合您的值),数据库答案仍将被截断。

另请注意,return 值的有效最大长度受到 MySQL 服务器的 max_allowed_packet 值的限制。

有关此 MySQL 配置的更多信息,请点击此处:http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

您可以使用 Yii::$app->db 访问应用程序的 database connection 对象。然后,您可以在调用 find:

之前设置 mysql 变量
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();

如果您使用过 ActiveDataProvider ,请尝试此代码:

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



    ]);
    $dataProvider->db->createCommand('SET group_concat_max_len = 1024*4')->execute();