$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();