在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]);
- 表示数组的第一个元素,其名称为'键
答案 0 :(得分:3)
不幸的是,这是数据结构中的一个问题。存储序列化数据使查询更加困难。 Math.log10
方法只生成SQL级别过滤,您确实需要代码级别过滤,因为SQL不知道PHP序列化是什么。有两种方法可以解决这个问题:
根据您的表格的大小,您可以返回搜索查询的所有结果,然后使用简单的循环来反序列化并删除不在乘客列表中的值。
伪代码将是:
andFilterWhere
可能最好的解决方案是改变您的数据结构,以便乘客以多对多的关系存储。这将允许您使用数据库查询执行此类过滤,并使您的数据正确标准化。