Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以调用“中的非序列化函数”吗;选择“操作”;Yii2活动查询的实现_Php_Sql_Yii2 - Fatal编程技术网

Php 我可以调用“中的非序列化函数”吗;选择“操作”;Yii2活动查询的实现

Php 我可以调用“中的非序列化函数”吗;选择“操作”;Yii2活动查询的实现,php,sql,yii2,Php,Sql,Yii2,在我的数据库表中,获奖者列表以序列化方式存储。我知道从数据库中获取winners记录后,我可以取消序列化数据并将其生成数组。但为此,我必须使用“foreach”循环,或者必须手动执行。我也成功地做到了这一点。 但我想到的一件事是,在执行查询期间,可以以非序列化的方式获取数据。下面是我的Yii2活动查询 $winners = Winners::find() ->select('winners') ->where(['event_id'=> Yii:

在我的数据库表中,获奖者列表以序列化方式存储。我知道从数据库中获取winners记录后,我可以取消序列化数据并将其生成数组。但为此,我必须使用“foreach”循环,或者必须手动执行。我也成功地做到了这一点。 但我想到的一件事是,在执行查询期间,可以以非序列化的方式获取数据。下面是我的Yii2活动查询

$winners = Winners::find()
        ->select('winners')
        ->where(['event_id'=> Yii::$app->session->get('event_id')])
        ->asArray()
        ->all();
这个问题给了我想要的。让我给你看看

(
[0] => Array
    (
        [winners] => a:10:{i:0;i:0;i:1;i:4;i:2;i:8;i:3;i:13;i:4;i:15;i:5;i:19;i:6;i:20;i:7;i:23;i:8;i:25;i:9;i:26;}
    )
但我希望获奖者名单是非连续的。我试着做了以下工作。

$winners = Winners::find()
        ->select(serialize('winners'))
        ->where(['event_id'=> Yii::$app->session->get('event_id')])
        ->asArray()
        ->all();
但是上面的查询生成了一个错误。是否有任何方法可以在查询执行期间取消对赢家列表的序列化,并以数组格式获取赢家列表

尝试以下操作:

$winners = Winners::find()
        ->select('winners')
        ->where(['event_id'=> Yii::$app->session->get('event_id')])
        ->asArray()
        ->all();

$result = unserialize($winners[0]['winners']);

现在使用$result。

您得到的错误是什么?我得到的是“Column not found”(未找到列)。您希望结果以非序列化形式出现,那么为什么要以序列化形式查询它?这是一个输入错误。我本想写一篇非序列化的文章,你不能。ActiveQuery用于将数据从DB加载到模型,而不是修改它们。而
serialize()
是php函数,数据库不知道数据是如何序列化的,因此不能使用SQL查询在数据库中取消序列化。您可以让数据加载到模型中,并在afterFind回调中取消序列化它们。您可以使用方法创建一些类,该方法将包装查询并在返回结果之前取消序列化数据。或者您可以创建自己的类来扩展ActiveQuery,重写它的
all()
方法来取消序列化数据,重写
Winners::find()
来使用您的类而不是ActiveQuery。这是一种手动取消序列化Winners列表的方法。我想在“选择”操作中写入非序列化函数。因此,获奖名单将是一个数组。我想要像这样的东西,选择('winners')作为非序列化('winners')。有点类似于这种方法,因此列赢家将自动取消序列化。