【问题标题】:php - closure within a closure - is there a better way?php - 闭包中的闭包 - 有更好的方法吗?
【发布时间】:2015-05-16 14:47:40
【问题描述】:

我正在使用一个键值对数组(其中的值可能是数组)来为 SQL 查询构造 WHERE 语句。

键值对被转换为 `key` = 'value' 并在它们之间放置 AND,但如果值是一个数组,则依次内爆为 OR 条件。

private function constructWhereStatement() {

  if (!isset($this->where) || !is_array($this->where)) {
     return 'WHERE 1';
  }

  array_walk($this->where, function(&$value, $key) {

     if (is_array($value)) {

        array_walk($value, function (&$v, $k, $key){
           $v = "`$key` = '$v'";
        }, $key);

        $value = "(" . implode(' OR ', $value) . ")";
     } else {
        $value = "`$key` = '$value'";
     }
  });
  return "WHERE " . implode(' AND ', $this->where);
}

所以,['side' => 'left', 'type' => ['page', 'dropdown']] 将返回:

WHERE `side` = 'left' AND (`type` = 'page OR `type` = 'dropdown')

有没有更好的方法来做到这一点?也许是递归?

【问题讨论】:

  • 有没有更好的方法将键/值对转换为 WHERE 语句...有不同的方法,但我不会说它们更好。但是,您可以看看更大的 PHP 框架/ORM 解决方案如何处理此类事情。例如,Laravel Eloquent 有一个不错的解决方案 IMO。您可以使用查询构建器构建查询,例如 ->whereId(1)->orWhere('sum', '>', 300)
  • 我在问更多关于是否有更好的方法来做这样的双重关闭。似乎有一种非常聪明的递归方式可以做到这一点。

标签: php sql recursion closures


【解决方案1】:

也许使用 IN()

WHERE `side` = 'left' AND type IN('type','dropdown')

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2019-08-31
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多