динамический выбор таблицы с использованием foreach - PullRequest
2 голосов
/ 13 июня 2011

Я использую kohana, и у меня есть эта модель для получения результатов поиска из базы данных, используя PDO:

class Model_Crud extends Model_Database {

  private $tables=array('articles','comments','pages');

  public function get_search_results()
  {
    $query = DB::query(Database::SELECT, 'SELECT * FROM :table WHERE ( title LIKE :search OR body LIKE :search OR tag LIKE :search)');
    $query->param(':search', $_POST['search'] );
    $query->bind(':table', $table );

    foreach($this->tables as $table)
    {
       //echo $query;
       $result[] = $query->execute();
    }

    return $result;
  }
} 

Это не будет работать, потому что оператор sql будет выглядеть в окончательном виде:

SELECT * FROM 'articles' WHERE ( title LIKE 'a random string' OR body LIKE 'a random string' OR tag LIKE 'a random string')

и, естественно, он терпит неудачу, так как статьи должны быть из '

Может ли что-то подобное сделать?или мне нужно написать 3 разных запроса, по одному для каждой таблицы?

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Взглянув на класс Database_Query, не кажется, что то, что вам нужно, можно сделать без создания отдельных запросов для каждой таблицы.

Вы можете расширить класс Database_Query с помощью метода set_table, который переводит :table.

Еще лучше, вы могли бы немного абстрагировать концепцию и добавить новые методы для перевода параметров, которые не должны быть обработаны. Взгляните на Database_Query :: compile , чтобы получить представление о том, как это делается. (Это совсем не сложно.)

1 голос
/ 13 июня 2011

Да, просто поместите имя таблицы в строку напрямую, а не в качестве параметра:

class Model_Crud extends Model_Database {

  private $tables=array('articles','comments','pages');

  public function get_search_results()
  {
    foreach($this->tables as $table)
    {
       $query = DB::query(Database::SELECT, 'SELECT * FROM ' . $table . ' WHERE ( title LIKE :search OR body LIKE :search OR tag LIKE :search)');
       $query->param(':search', $_POST['search'] );

       //echo $query;
       $result[] = $query->execute();
    }

    return $result;
  }
} 

Обычно это не очень хорошая идея из-за внедрения SQL, но так как список таблиц закодированв вашей программе вам не нужно беспокоиться об этом в этом случае.

...