Laravel控制器创建优先级客户数组并传递至外部findActive函数
如何在Laravel控制器中创建优先级客户数组并用于SQL NOT IN查询?
咱们先理清楚你的核心需求:你已经有一段能把符合条件的客户标记为priority状态的运行代码,现在需要把这些优先级客户的编号收集成数组,传给activeCust.php里的findActive函数,最终实现「查询不在优先级列表里的客户」的SQL逻辑。下面一步步来实现:
第一步:在控制器中收集优先级客户编号数组
你只需要在现有代码块的基础上,先初始化一个空数组,每当标记客户为priority时,就把它的custNum添加进去。修改后的控制器代码如下:
// 初始化空数组存储优先级客户编号 $priorityCustNums = []; $now = Carbon::now(); $deadline = Carbon::now()->subMonths(2); // 假设$yourQueryResults是你原有的查询结果集合 foreach ($yourQueryResults as $d) { $d->createdAt = new \DateTime($d->created_at); if ($d->nextDate <= $now && $d->createdAt > $deadline && $d->status != 'exempt') { $d->status = 'priority'; // 将符合条件的客户编号加入数组 $priorityCustNums[] = $d->custNum; } }
第二步:处理数组并安全传递给findActive函数
直接把数组拼进SQL会有SQL注入风险,而且空数组会导致NOT IN语法异常,所以咱们先做处理:
// 处理空数组:如果没有优先级客户,给一个不会匹配任何值的默认值(比如0) $custNumParam = empty($priorityCustNums) ? '0' : implode(',', array_map(function($num) { // 对编号做转义,防止SQL注入 return is_numeric($num) ? (int)$num : DB::connection()->getPdo()->quote($num); }, $priorityCustNums)); // 实例化类并调用函数 $activeCust = new activeCust(); $nonPriorityCustomers = $activeCust->findActive($custNumParam);
第三步:优化activeCust.php中的findActive函数
原来的函数没有处理参数安全和空数组场景,咱们调整一下:
public function findActive($custNumParam){ // 确保SQL语法正确,同时避免注入风险 $sql = "SELECT c.customer FROM customers c WHERE c.customer NOT IN ($custNumParam)"; // 执行查询并返回结果(根据你项目的数据库操作方式调整,比如用DB门面或PDO) return DB::select($sql); }
额外提示:更Laravel化的优雅写法
如果你的项目是Laravel,推荐用Eloquent查询构造器,完全避免手动拼接SQL,安全又简洁:
修改activeCust.php的函数:
use Illuminate\Support\Facades\DB; public function findActive(array $priorityCustNums){ return DB::table('customers') ->whereNotIn('customer', $priorityCustNums) ->select('customer') ->get(); }
对应的控制器调用更简单:
// 直接传递数组,Laravel自动处理转义和空数组 $activeCust = new activeCust(); $nonPriorityCustomers = $activeCust->findActive($priorityCustNums);
当数组为空时,whereNotIn会自动被忽略,返回所有客户,这更符合业务预期。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

