Как выполнить простой SQL с помощью Doctrine в Symfony 3

DQL как язык запросов имеет конструкции SELECT, UPDATE и DELETE, которые сопоставляются с их соответствующими типами операторов SQL.

Однако есть много операторов, таких как вставка, которые не разрешены (или не существуют) в DQL, потому что сущности и их отношения должны быть введены в контекст постоянства через EntityManager для обеспечения согласованности вашей объектной модели.

По сути, если вы хотите использовать обычный SQL для вставки информации в вашу базу данных, вы выбрасываете модель в мусорное ведро … однако, возможность использования простого SQL-файла пригодится, если у вас действительно очень сложные запросы, которые не могут быть достигнуто с использованием DQL по многим причинам (сложно или нет доступных расширений доктрины для использования пользовательских функций и т. д.).

В этой статье вы узнаете, как легко выполнить простой SQL-запрос, используя доктрину в Symfony 3.

использование

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

В следующем примере показано, как использовать простой SQL-запрос с контроллера Symfony:

getDoctrine()->getManager();
$RAW_QUERY = 'SELECT * FROM my_table where my_table.field = 1 LIMIT 5;';
$statement = $em->getConnection()->prepare($RAW_QUERY);
$statement->execute();
$result = $statement->fetchAll();
}
}

$result Переменная должна содержать ассоциативный массив с 5 строками базы данных.

Параметры привязки

Таким же образом, как это делает построитель запросов доктрины, вы можете установить параметры для вашего запроса, используя bindValue метод в вашем заявлении, чтобы сделать ваши запросы более динамичными.

getDoctrine()->getManager();
$RAW_QUERY = 'SELECT * FROM my_table where my_table.field = :status LIMIT 5;';
$statement = $em->getConnection()->prepare($RAW_QUERY);
// Set parameters
$statement->bindValue('status', 1);
$statement->execute();
$result = $statement->fetchAll();
}
}

Несколько баз данных

Как вы работаете с несколько базами данных, естественно, у вас есть более 1 менеджера. Как упоминалось ранее, просто получите соединение менеджера сущностей, который нацелен на базу данных, которую вы хотите запросить.

getDoctrine()->getManager('database_or_connection_name1');
$DatabaseEm2 = $this->getDoctrine()->getManager('database_or_connection_name2');
// Write your raw SQL
$rawQuery1 = 'SELECT * FROM my_table where my_table.field = :status LIMIT 10;';
$rawQuery2 = 'SELECT * FROM my_table where my_table.field = :text LIMIT 5;';
// Prepare the query from DATABASE1
$statementDB1 = $DatabaseEm1->getConnection()->prepare($rawQuery1);
$statementDB1->bindValue('status', 1);
// Prepare the query from DATABASE2
$statementDB2 = $DatabaseEm2->getConnection()->prepare($rawQuery2);
$statementDB2->bindValue('text', 'Hello World');
// Execute both queries
$statementDB1->execute();
$statementDB2->execute();
// Get results :)
$resultDatabase1 = $statementDB1->fetchAll();
$resultDatabase2 = $statementDB2->fetchAll();
}
}

Повеселись !

Ссылка на основную публикацию
Adblock
detector