PHP YII2设置会话group_concat_max_len

时间:2015-06-09 12:01:28

标签: php yii

$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吗?

3 个答案:

答案 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();

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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



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