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条记录,所以它只输出其中的一半。

问题是,它是可能设置会话group_concat_max_len在Yii2框架?

您可以使用Yii::$app->db访问应用程序的数据库连接对象。你可以在调用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();

您可以使用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(在我的示例中,选择最适合您的值),则DB回答仍然会被截断。

还要注意,返回值的有效最大长度受到MySQL服务器的max_allowed_packet的值的限制。

更多关于MySQL的配置在这里:http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

如果您已经使用了ActiveDataProvider,请尝试此代码:

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

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