如何使用Propel 2 ORM在一个查询中将多行插入数据库?

时间:2015-04-18 00:50:27

标签: php sql propel

我已将我的项目转为Propel。据我所知,Propel不会实现某些特定数据库特有的功能,以便尽可能与平台无关(例如,MySQL中的LAST_INSERT_ID())。但是,我无法在Propel's Documentation中找到任何文档,以便能够一次插入多行。我也没能在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();

但是,是否存在不涉及直接SQL操作的ORM方法?

1 个答案:

答案 0 :(得分:2)

推动的想法是让你尽可能少地编写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();

the dox

中查看PropelObjectCollection的强大功能

我希望这能让你更接近答案。