2017-10-06 68 views
0

我想在Laravel中使用查询生成器编写查询。我有一个名为'packages'的表,它有一个列'activities'。该列的值存储为序列化数组。例如a:1:{i:0;s:1:"2";}。现在我想通过比较“活动”列中的值来搜索表格。例如,我将有一个数组$arr = array(0=>2, 1=>5, 2=>1)我想将其与'activities'列进行比较。使用序列化数组搜索表

$query = DB::table('packages'); 
$query = $query->where('activities', $arr); 
$packages = $query->get(); 

它应该选择所有至少有一个活动的行。即在上面的例子中,它应该选择所有在其活动中至少有2,5或1的行。我想要使​​用Laravel Query Builder的解决方案。请帮忙。

+0

我不认为这是可能的使用serialize() function数组转换成连载阵列。也许你应该尝试使用JSON来代替varchar列。 https://laravel.com/docs/5.5/queries#json-where-clauses –

+0

可能的重复[我如何从序列化字段在mysql数据库中搜索?](https://stackoverflow.com/questions/24508164/how -do-i-search-from-serialize-field-in-mysql-database) – AZinkey

+0

你应该将这些活动保存为逗号分隔值,例如2,5,1,而不是序列化字符串 – AZinkey

回答

0

使用连载功能

$query = DB::table('packages'); 
$query = $query->where('activities', serialize($arr)); 
$packages = $query->get(); 
0

首先,你必须在PHP

$arr = serialize($arr); 

$data = $query->where([['activities', $arr], ['activities', '<>', '']])->get()->toArray(); 

$data = unserialize($data); 

$activities = !empty($data) ? $data['activities'] : ''; 

@if(!empty($activities)) // check condition if activities are not empty 

$result = $data; // database data 

@enfif 


OR 

$data = $query->where('activities', 'like', '%' . $arr .'%')->get(); 
+0

它应该选择所有至少有一行活动。我已经更新了这个问题。 – user1690835

+0

当你想检查活动不是空的,然后在where子句中通过多个条件,检查更新的答案 –

+0

不,我的意思是,至少有一个活动在$ arr中。 – user1690835