我正在使用带有propelorm / PropelBundle(Propel 1.6)和MySQL(带有声明外键的InnoDB)的Symfony 2,我正在使用Using Custom 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')的列只在需要时通过对数据库的附加查询加载到视图中(我相信这称为延迟加载,我不想要)。有没有办法在上面的初始查询中使用连接表('verb')的列来水合推进对象集合($ verb_nouns),以便以后消除对数据库的大量查询?
实际上,使用上面的代码和下面的代码(在Twig的视图文件中)会导致foreach语句中每个循环的一个数据库连接:
{% for verb_noun in verb_nouns %}
<li>{{ verb_noun.NounId }}. {{ verb_noun.verb.Name }}</li>
{% endfor %}
答案 0 :(得分:0)
如果我正确理解您的问题,您无需进行手动补水或自定义查询。只需使用其中一个连接方法,例如:VerbNounQuery::create()->joinVerb()->find()
,它将返回一个VerbNouns的集合,其中已经填充了它们的名词 - 所有这些都在对数据库的一次查询中。
我强烈推荐自动完成IDE,它会帮助您更轻松地探索查询系统。
答案 1 :(得分:0)
因为我今天遇到了这个问题,所以我想在这里发布解决方案。使用setClass
或setPeer
我收到constant(): Couldn't find constant XXX::PEER'
- 通知。
因此,似乎必须将Criteria
传递给ObjectFormatter
才能使其正常工作:
$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);