Как вставить несколько строк в базу данных в одном запросе с помощью Propel 2 ORM?
Я переключил свой проект на Propel. Я понимаю, что некоторые функции, которые являются уникальными для конкретной базы данных, не будут реализованы Propel, чтобы быть настолько независимыми от платформы, насколько это возможно (пример, LAST_INSERT_ID()
в MySQL). Однако я не могу найти какую-либо документацию в документации Propel для возможности вставлять несколько строк одновременно. Я также не смог найти никаких ссылок на него в SO или с помощью поиска.
Доступна ли эта функция в Propel 2?
Я знаю, что такие вещи будут работать (адаптировано из документации Propel):
use Propel\Runtime\Propel;
$con = Propel::getWriteConnection(\Map\BookTableMap::DATABASE_NAME);
$sql = "INSERT INTO book (first_name,last_name) VALUES ('Leo', 'Tolstoy'),
('Jane','Austen')";
$stmt = $con->prepare($sql);
$stmt->execute();
Тем не менее, есть ли подход ORM, который не предполагает прямого манипулирования SQL?
1 ответ
Идея propel заключается в том, что вы пишете как можно меньше SQL. Так что этот пример - путь нет.
Я не понимаю того обстоятельства, в котором вы находитесь, что требует, чтобы все были спасены сразу, а не при создании, но я пойду с этим.
Что вам нужно сделать, это начать с коллекции объектов.
$collection = new PropelObjectCollection();
Затем вы создадите объекты и поместите их в коллекцию.
$newBook = (new Book)->setFirstName('leo')
->setLastName('Tolstoy');
Если у вас есть четко определенные массивы, вы также можете использовать
$newBook = (new Book)->fromArray($wellDefinedArray);
Создав объекты, вы можете сохранить их или поместить в коллекцию:
$collection->append($newBook);
И сохранить коллекцию:
$collection->save();
Я настоятельно считаю, что вы должны сохранять каждый из них, когда создаете объекты:
(new Book)->setFirstName('Leo')
->setLastName('Tolstoy')
->save();
Вы можете вызвать вышеупомянутое в цикле или добавить их все в коллекцию в цикле.
Если у вас очень большой набор данных, цикл может быть не лучшим.
(new PropelObjectCollection)->setModel('Book')
->importFrom('JSON',$someJson)
->save();
Посмотрите на силу PropelObjectCollection в dox
Надеюсь, это приблизит вас к ответу.