$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吗?
答案 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_packet值的限制。
有关此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
:
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();