首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将连接关系对象排除在Propel中的结果集中的方法?

将连接关系对象排除在Propel中的结果集中的方法?
EN

Stack Overflow用户
提问于 2015-07-15 14:35:20
回答 1查看 286关注 0票数 1

我有4个表,它们表示一个简单的调查数据库设置:

代码语言:javascript
复制
table name: (delimited columns)
---------------------------------------------------------------
survey: (id, title)
surveyQuestion: (id, title)
surveyAnswer: (id, surveyQuestionID, title, sortOrder)
surveyToSurveyQuestion: (surveyID, surveyQuestionID, sortOrder)

下面是我用来提取所有相关问题和答案的所有调查的查询:

代码语言:javascript
复制
$query = SurveyQuery::create()
    ->joinWith('SurveyToSurveyQuestion')
    ->useSurveyToSurveyQuestionQuery()
        ->orderBySurveyId()
        ->orderBySortOrder()
        ->joinWith('SurveyQuestion')
        ->useSurveyQuestionQuery()
            ->joinWith('SurveyAnswer')
            ->useSurveyAnswerQuery()
                ->orderBySortOrder()
            ->endUse()
        ->endUse()
    ->endUse();

然而,随着我增加更多的调查,特别是如果调查有共同的问题的话,多对多的'SurveyToSurveyQuestion‘关系会变得臃肿。

是否有方法将'**SurveyToSurveyQuestion**‘数据从结果数据集中排除?

编辑:

附加数据库架构。

代码语言:javascript
复制
<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完成了我的工作。谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 22:50:04

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

您可以排除导致联接对象不存在的联接调用。

此外,我对每项调查都有自己的方法,得到他们各自的问题和答案。

代码语言:javascript
复制
$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的访问,但我认为总体效率会好得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31433386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档