如何在比较之前通过andFilterWhere来反序列化字段(['喜欢',...)

时间:2015-11-13 14:15:15

标签: php mysql serialization yii yii2

在yii2中我有搜索模型:

public function search($params)
{
    $query = MyModel::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }

    $query->andFilterWhere(['like', 'passengers', $this->passengers]);

    return $dataProvider;
}

passengers是mysql表中包含序列化数组的TEXT字段。

问:如何告诉andFilterWhere()函数进行反序列化并通过数组中的任何元素进行比较?这样的事情:$query->andFilterWhere(['like', unserialize('passengers')[0]['name'], $this->passengers]); - 表示数组的第一个元素,其名称为'键

1 个答案:

答案 0 :(得分:3)

不幸的是,这是数据结构中的一个问题。存储序列化数据使查询更加困难。 Math.log10方法只生成SQL级别过滤,您确实需要代码级别过滤,因为SQL不知道PHP序列化是什么。有两种方法可以解决这个问题:

发布查询过滤器

根据您的表格的大小,您可以返回搜索查询的所有结果,然后使用简单的循环来反序列化并删除不在乘客列表中的值。

伪代码将是:

andFilterWhere

更改您的结构

可能最好的解决方案是改变您的数据结构,以便乘客以多对多的关系存储。这将允许您使用数据库查询执行此类过滤,并使您的数据正确标准化。