【问题标题】:Search table by using serialized array使用序列化数组搜索表
【发布时间】:2017-10-06 04:46:15
【问题描述】:

我正在尝试使用 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 查询生成器的解决方案。请帮忙。

【问题讨论】:

标签: php mysql laravel


【解决方案1】:

使用序列化功能

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

【讨论】:

    【解决方案2】:

    首先您必须在 php 中使用 serialize() function 将数组转换为序列化数组

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

    【讨论】:

    • 它应该选择所有至少有一个活动的行。我已经更新了问题。
    • 当您希望检查活动不为空然后在 where 子句中传递多个条件时,检查更新的答案
    • 不,我的意思是,至少有一个活动在 $arr 中。
    • 检查更新的答案,您必须首先从数据库中获取所有非空且匹配的数据,然后检查活动数组,如更新的答案所示
    • 它不工作。首先它显示错误“调用数组上的成员函数 toArray()”。在我删除 ->toArray() 后,它显示错误'unserialize() 期望参数 1 是字符串,给定数组'
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2012-04-06
    相关资源
    最近更新 更多