我已将我的项目切换到 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 方法?
最佳答案
propel 的想法是让你编写尽可能少的 SQL。所以这个例子是不行的。
我不明白你所处的环境需要所有的东西立即被拯救,而不是在创造时被拯救,但我会同意。
您需要做的是从对象集合开始。
$collection = new PropelObjectCollection();
然后您将创建 propel 对象并将它们放入集合中。
$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 的强大功能
我希望这能让您更接近答案。
关于php - 如何使用 Propel 2 ORM 在一个查询中将多行插入数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711619/