"PHP" / Говнокод #6077 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
class Query {
  protected $baseTable;
  protected $baseTableAlias;
  protected $whereGroup;

  protected $joins = array();
  protected $fields = array();

  protected $executed = FALSE;
  protected $resource = NULL;


  function __construct($base_table = 'node', $alias = 'n') {
    $this->whereGroup = new QueryWhereGroup();
    $this->baseTable = $base_table;
    $this->baseTableAlias = empty($alias) ? $base_table : $alias;
  }

  function select($fields) {
    settype($fields, 'array');
    foreach ($fields as $alias => $field) {
      if (is_numeric($alias)) {
        $this->fields[] = $field;
      }
      else {
        $this->fields[$alias] = "$field as $alias";
      }
    }

    return $this;
  }

  /**
   * @param QueryWhereGroup $whereGroup
   * @return Query
   */
  function where($whereGroup) {
    call_user_func_array(array($this->whereGroup, 'cond'), func_get_args());
    return $this;
  }

  function createWhereGroup() {
    return new QueryWhereGroup();
  }

  function join($table, $alias = NULL, $condition, $join_type = 'INNER') {
    if (!$alias) {
      $alias = $table;
    }

    if (is_array($condition)) {
      $condition = 'USING ('. join(', ', $condition) .')';
    }
    if (!preg_match('/^ON|USING/i', $condition)) {
      $condition = 'ON '. $condition;
    }

    $this->joins[$alias] = "$join_type JOIN $table $alias $condition";
    return $this;
  }

  function compile() {
    $select_fields = join(', ', array_unique($this->fields));
    $joins_list = join("\n", $this->joins);
    $where_conditions = $this->whereGroup->compile();

    if (!empty($where_conditions)) {
      $where_conditions = 'WHERE '. $where_conditions;
    }

    return "SELECT $select_fields FROM {{$this->baseTable}} {$this->baseTableAlias} \n $joins_list $where_conditions";
  }

  function args() {
    return $this->whereGroup->args;
  }

  function execute() {
    return db_query($this->compile(), $this->args());
  }

  function fetchAll() {
    $res = $this->execute();
    while($row = db_fetch_object($res)) {
      $rows[] = $row;
    }
    return $rows;
  }
}

построитель запросов (drupal 6)
wheregroup здесь http://govnokod.ru/6076

Запостил: vectoroc vectoroc, (Updated )

Комментарии (13) RSS

  • Мне вот не понятно как тут limit, order, group проставлять. Да и слишком громкое название у класса Query, который занимается только Selectом.
    Ответить
    • ээ? SELECT возвращает курсор в отличие от других инструкций
      Ответить
            • селект возвращает данные, инсерт - нет.
              совсем уже с этим вашим мускулом азы не знаете...
              Ответить
              • Всё равно не понимаю как "селект возвращает данные, инсерт - нет" противоречит "слишком громкое название у класса Query, который занимается только Selectом."?
                Ответить
                • тогда придётся просто поверить, что выборка и прочий DML таки можно функционально разделить 😛

                  в любом случае, этот "конструктор запросов" сказочно убог (речь не об отсутствии INSERT et al), и пора уже сейчас задуматься об его переписывании


                  спойлер: я сказал задуматься, а не бросаться сразу писать килостроки хуйни 😛
                  Ответить
                  • Есть предложения, как переписать? Интересно будет послушать.
                    И да, это просто велосипед, написанный на коленке, не претендующий на что либо
                    Ответить
                    • Если бы мне вдруг захотелось прикрыть мутным пхпшным велосипедом прозрачную логику SQL, то я бы инкапсулировал множества и реализовал операции над ними
                      Ответить
    • Я у себя уже переименовал в SelectQuery
      limit, order, group несложно встроить, я думаю.
      Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8