ВЫБЕРИТЕ с помощью JOIN - PullRequest
       5

ВЫБЕРИТЕ с помощью JOIN

1 голос
/ 21 июня 2010

Я хочу построить запрос, используя Zend_db_select и JOIN. База данных выглядит следующим образом:

[AUTHOR таблица] pk: 'id' attr: 'name'

[БРОНИРОВАТЬ стол] pk: 'id' attr: 'name' fk: 'author.id'

У меня есть author.name в качестве параметра. Я хочу получить все связанные книги (только book.name, а не другие столбцы)

Пожалуйста, помогите. Спасибо

1 Ответ

4 голосов
/ 21 июня 2010

Если вам действительно нужно использовать Zend_Db_Select, вы можете сделать это:

$select = $db->select()
    ->from(array("a"=>"AUTHOR"), array("author_name"=>"name"))
    ->join(array("b"=>"BOOK"), "a.id = b.`author.id`", array("book_name"=>"name"))
    ->where("a.name = ?", $authorName);

$stmt = $select->query();

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

Так что я бы сделал это более просто, просто используя буквальный SQL:

$sql = "
    SELECT a.name AS author_name, b.name AS book_name
    FROM AUTHOR AS a JOIN BOOK AS b ON a.id = b.`author.id`
    WHERE a.name = ?";
$books = $db->fetchAll($sql, $authorName);

Ваш комментарий: Zend_Db_Select не предоставляет ничего с точки зрения безопасности или производительности, которую вы не можете получить так же легко другими способами. Независимо от того, используете ли вы Zend_Db_Select или просто одну литеральную строку для вашего SQL, конечный результат - это одно и то же: строка, которую вы впоследствии подготовите как запрос SQL. База данных не имеет представления о различных способах создания этой строки.

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

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

Что касается безопасности, вы можете использовать параметр-заполнитель для имени автора и указать это значение в качестве аргумента после подготовки запроса. Вы можете сделать это так же легко с помощью буквального SQL-запроса, как и с Zend_Db_Select.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...