0

我将 Symfony 2 与 propelorm/PropelBundle(Propel 1.6)和 MySQL(带有声明的外键的 InnoDB)一起使用,并且我正在使用自定义 SQL,如使用自定义 SQL水合推进对象集合部分所示,如下所示:

$con = Propel::getConnection(VerbNounPeer::DATABASE_NAME);
$sql = "SELECT verb_noun.*, verb.* FROM verb_noun"
        ." JOIN verb ON verb_noun.verb_id = verb.id";
$stmt = $con->prepare($sql);
$stmt->execute();

$formatter = new PropelObjectFormatter();
$formatter->setClass('Company\SiteBundle\Model\VerbNoun');
$verb_nouns = $formatter->format($stmt);

注意:这不是实际的查询——我放了一个简单的例子来说明需求。我的实际查询更复杂,因此需要使用“自定义 SQL”而不是推进方法。

我无法一次性将连接表的列水合到推进对象集合中。连接表的列(“动词”)仅在需要时通过对数据库的其他查询加载到视图中(我相信这称为延迟加载,我不想要)。有没有办法在上述初始查询中将推进对象集合($verb_nouns)与连接表('verb')的列混合,以消除以后对数据库的大量查询?

实际上,使用上面的代码和下面的代码(在 Twig 的视图文件中)会为 foreach 语句中的每个循环生成一个数据库连接:

{% for verb_noun in verb_nouns %}
    <li>{{ verb_noun.NounId }}.&nbsp;{{ verb_noun.verb.Name }}</li>
{% endfor %}
4

2 回答 2

0

如果我正确理解您的问题,您无需手动补水或自定义查询。只需使用其中一种连接方法,例如:VerbNounQuery::create()->joinVerb()->find()这将返回一组 VerbNouns,其中已经填充了它们的名词 - 所有这些都在一个查询中到 db。

顺便说一句,我强烈推荐一个自动完成的 IDE——它将帮助您更轻松地探索查询系统。

于 2012-04-29T08:35:47.920 回答
0

因为我今天也遇到了这个问题,所以我想在这里发布解决方案。使用setClassorsetPeer我得到了constant(): Couldn't find constant XXX::PEER'-notice。所以看来你必须将 a 传递CriteriaObjectFormatter这个才能工作:

$con = Propel::getConnection(VerbNounPeer::DATABASE_NAME);
$sql = "SELECT verb_noun.*, verb.* FROM verb_noun"
        ." JOIN verb ON verb_noun.verb_id = verb.id";
$stmt = $con->prepare($sql);
$stmt->execute();

$formatter = new PropelObjectFormatter(new VerbNounQuery());
$verb_nouns = $formatter->format($stmt);
于 2013-11-04T07:59:57.780 回答