Как вставить несколько строк в базу данных в одном запросе с помощью 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

Надеюсь, это приблизит вас к ответу.

Другие вопросы по тегам