Mysql 如何在一个查询中使用自定义SQL将联接表中的列水合到推进对象集合中?

Mysql 如何在一个查询中使用自定义SQL将联接表中的列水合到推进对象集合中?,mysql,symfony,propel,Mysql,Symfony,Propel,我将Symfony 2与propolorm/PropelBundle(Propel 1.6)和MySQL(带有声明外键的InnoDB)一起使用,并使用自定义SQL(如本节所示)创建一个Propel对象集合,如下所示: $con = Propel::getConnection(VerbNounPeer::DATABASE_NAME); $sql = "SELECT verb_noun.*, verb.* FROM verb_noun" ." JOIN verb ON verb_no

我将Symfony 2与propolorm/PropelBundle(Propel 1.6)和MySQL(带有声明外键的InnoDB)一起使用,并使用自定义SQL(如本节所示)创建一个Propel对象集合,如下所示:

$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_nomes)与联接表('verb')的列混合,以消除以后对数据库的大量查询

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

{% for verb_noun in verb_nouns %}
    <li>{{ verb_noun.NounId }}.&nbsp;{{ verb_noun.verb.Name }}</li>
{% endfor %}
{动词\名词%中的动词\名词%}
  • {{动词\名词.名词ID}。{{动词\名词.动词.名称}
  • {%endfor%}
    如果我正确理解您的问题,您不需要手动或自定义查询。只需使用如下连接方法之一:
    verbNonQuery::create()->joinVerb()->find()
    ,这将返回一个包含已填充名词的verbNonys集合,所有这些都在一个查询中返回给db


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

    因为我今天也遇到了这个问题,所以我想在这里发布解决方案。使用
    setClass
    setPeer
    我得到了
    常量():找不到常量XXX::PEER'
    -注意。 因此,您似乎必须将
    标准
    传递给
    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);
    

    Hello@halfer,我实际上希望使用“自定义SQL”,因为我尝试执行的实际查询比上面的简化版本更复杂。我知道使用推进方法是可行的(实际上我也使用推进方法进行了更复杂的查询),但是使用“自定义SQL”进行查询速度更快,也不那么麻烦。因此,我的问题考虑到了这个限制(使用“自定义SQL”)…对,没问题-可能值得编辑您的问题以使其更清楚。否则,逻辑上的回答可能是:“对于该查询,您不需要自定义SQL”!至于答案:我肯定会尝试使用Query类来完成。我会尝试使用
    select()
    方法来提供列名,我认为这是一个数组。我不知道如何指定原始SQL,但它应该可以在查询中进行-如果文档失败,请检查自动完成
    :)
    。感谢@halfer的编辑和建议。我会继续寻找一个优雅的解决方案…没问题。另外,不要在这上面停留太久:只需先给一张桌子补水,然后让其他桌子根据需要加满水。它可能会比理想的速度慢,但要让它工作并投入使用——通常性能并不像人们预期的那么差。不要过早优化
    :)