Php 如何从“推进”中的结果集中排除关联关系对象?

Php 如何从“推进”中的结果集中排除关联关系对象?,php,mysql,sql,propel,Php,Mysql,Sql,Propel,我有4个表,代表一个简单的测量数据库设置: table name: (delimited columns) --------------------------------------------------------------- survey: (id, title) surveyQuestion: (id, title) surveyAnswer: (id, surveyQuestionID, title, sortOrder) surveyToSurveyQuestion: (surv

我有4个表,代表一个简单的测量数据库设置:

table name: (delimited columns)
---------------------------------------------------------------
survey: (id, title)
surveyQuestion: (id, title)
surveyAnswer: (id, surveyQuestionID, title, sortOrder)
surveyToSurveyQuestion: (surveyID, surveyQuestionID, sortOrder)
下面是一个查询,我使用它来获取所有调查以及所有相关的问题和答案:

$query = SurveyQuery::create()
    ->joinWith('SurveyToSurveyQuestion')
    ->useSurveyToSurveyQuestionQuery()
        ->orderBySurveyId()
        ->orderBySortOrder()
        ->joinWith('SurveyQuestion')
        ->useSurveyQuestionQuery()
            ->joinWith('SurveyAnswer')
            ->useSurveyAnswerQuery()
                ->orderBySortOrder()
            ->endUse()
        ->endUse()
    ->endUse();
然而,当我添加更多调查时,多对多“
SurveyToSurveyQuestion
”关系变得臃肿,特别是当调查共享问题时

是否有办法从结果数据集中排除'
SurveyToSurveyQuestion
'数据?

编辑:

附加数据库模式

<table name="survey" idMethod="native" phpName="Survey">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="statusID" phpName="StatusID" type="INTEGER" required="true"/>
    <column name="code" phpName="Code" type="VARCHAR" required="true"/>
    <column name="createdDate" phpName="CreatedDate" type="TIMESTAMP" default="0000-00-00 00:00:00"/>
    <index name="INDEX_StatusID">
        <index-column name="statusID"/>
    </index>
    <foreign-key foreignTable="status">
        <reference local="statusID" foreign="id"/>
    </foreign-key>
    <vendor type="mysql">
        <parameter name="Engine" value="InnoDB"/>
    </vendor>
</table>
<table name="surveyQuestion" idMethod="native" phpName="SurveyQuestion">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="surveyQuestionTypeID" phpName="SurveyQuestionTypeID" type="INTEGER" required="true"/>
    <column name="code" phpName="Code" type="VARCHAR" required="true"/>
    <index name="INDEX_SurveyQuestionTypeID">
        <index-column name="surveyQuestionTypeID"/>
    </index>
    <foreign-key foreignTable="surveyQuestionType">
        <reference local="surveyQuestionTypeID" foreign="id"/>
    </foreign-key>
    <vendor type="mysql">
        <parameter name="Engine" value="InnoDB"/>
    </vendor>
</table>
<table name="surveyQuestionType" idMethod="native" phpName="SurveyQuestionType">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="title" phpName="Title" type="VARCHAR" required="true"/>
    <vendor type="mysql">
        <parameter name="Engine" value="InnoDB"/>
    </vendor>
</table>
<table name="surveyAnswer" idMethod="native" phpName="SurveyAnswer">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="surveyQuestionID" phpName="SurveyQuestionID" type="INTEGER" required="true"/>
    <column name="code" phpName="Code" type="VARCHAR" required="true"/>
    <column name="sortOrder" phpName="SortOrder" type="INTEGER"/>
    <index name="INDEX_SurveyQuestionID">
        <index-column name="surveyQuestionID"/>
    </index>
    <foreign-key foreignTable="surveyQuestion">
        <reference local="surveyQuestionID" foreign="id"/>
    </foreign-key>
    <vendor type="mysql">
        <parameter name="Engine" value="InnoDB"/>
    </vendor>
</table>
<table name="surveyToSurveyQuestion" idMethod="native" phpName="SurveyToSurveyQuestion">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="surveyID" phpName="SurveyID" type="INTEGER" required="true"/>
    <column name="surveyQuestionID" phpName="SurveyQuestionID" type="INTEGER" required="true"/>
    <column name="sortOrder" phpName="SortOrder" type="INTEGER"/>
    <index name="INDEX_SurveyID">
        <index-column name="surveyID"/>
    </index>
    <index name="INDEX_SurveyQuestionID">
        <index-column name="surveyQuestionID"/>
    </index>
    <foreign-key foreignTable="survey">
        <reference local="surveyID" foreign="id"/>
    </foreign-key>
    <foreign-key foreignTable="surveyQuestion">
        <reference local="surveyQuestionID" foreign="id"/>
    </foreign-key>
    <vendor type="mysql">
        <parameter name="Engine" value="InnoDB"/>
    </vendor>
</table>


编辑:使用
join
代替
joinWith
为我完成了这项工作。谢谢@kriple.

使用
->useSurveyToSurveyQuestion()
不需要使用
->joinwith()

可以排除导致连接对象不存在的连接调用

此外,我会在每次调查中提供相应的问题和答案的方法

$surveys = SurveyQuery::create()->filterByXXX()->find()
foreach($survey as $s){
  //Grab each survey's respective data
  $QandA = $s->getQuestionsAndAnswers();
  // do something with the data.
  $otherClass->doStuffWithData($QandA);
}

这样做无疑会增加到DB的行程,但我认为总体效率会更好

跳过
joinwith()
,+1的好处很好。但是,如果删除joinWith('SurveyToSurveyQuestion')行,则查询将失败。还有其他想法吗?查询失败,没有结果?或者某种php错误?错误是模型、别名或表“Survey”上的未知列“SurveyId”
joinWith()
方法
向查询中添加一个JOIN子句并对相关对象进行水合物化,试着使用just
JOIN()
@Kriple:再次运行并注意到您最后的注释。谢谢