如何在1个查询中使用自定义SQL将JOIN表中的列水合成Propel Object集合?

时间:2012-04-27 23:00:55

标签: mysql symfony propel

我正在使用带有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 }}.&nbsp;{{ verb_noun.verb.Name }}</li>
{% endfor %}

2 个答案:

答案 0 :(得分:0)

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

我强烈推荐自动完成IDE,它会帮助您更轻松地探索查询系统。

答案 1 :(得分:0)

因为我今天遇到了这个问题,所以我想在这里发布解决方案。使用setClasssetPeer我收到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);