2017-02-21 42 views
1

我正在使用Propel 2.我在连接条件方面存在问题。正因为如此,我无法使用Propel API获取数据,我不得不使用普通SQL和PDO。这里是我的表结构:在Propel中只使用一个连接条件

<table name="categories" phpName="Categories"> 
    <column name="id"   type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="parent_id" type="integer" required="true" defaultValue="0"/> 
    <column name="root_id"  type="integer" required="true" defaultValue="0"/> 
    <column name="redirect_id" type="integer" required="false" defaultValue="null"/> 
    <column name="name"   type="varchar" size="255" required="true" defaultValue=""/> 
    <column name="status"  type="char" sqlType="enum('active','deleted','disabled')" required="true" defaultValue="active"/> 
    <foreign-key foreignTable="categories" phpName="Categories"> 
    <reference local="parent_id" foreign="id"/> 
    <reference local="redirect_id" foreign="id"/> 
    </foreign-key> 
    <vendor type="mysql"> 
    <parameter name="Engine" value="InnoDB"/> 
    <parameter name="Charset" value="utf8"/> 
    </vendor> 
</table> 

我想用下面的SQL:

SELECT c.id, c.name 
FROM  categories c 
LEFT JOIN categories p ON c.parent_id = p.id 
WHERE  c.status = 'active' AND p.status = 'active' AND c.name LIKE '%Laptop%' 

的行走生成的模型的方法,我用:

$categories = CategoriesQuery::create('c') 
     ->filterByName("%{$name}%") 
     ->filterByStatus('active') 
     ->useCategoriesQuery('p') 
      ->filterByStatus('active') 
     ->endUse() 
     ->find(); 

生成的SQL这样,总是有两个加入条件LEFT JOIN categories p ON (categories.parent_id=p.id AND categories.redirect_id=p.id)。我试过使用join(),addJoin()where(),等没有似乎帮助。很明显,问题出在我对Propel的了解上。

回答

1

一般情况下,我已经找到了最成功的做复杂的自通过以下方法合并联接:

Join::addExplicitCondition Join::setJoinType ModelCriteria::addJoinObject ModelCriteria::where

然而,在这种情况下,你的问题很简单。您要求Propel使用组合外键,因此它在查询的组合外键中使用两个列。

我敢打赌,你的问题是你正试图使用​​一个外键,你应该使用两个单独的外键为两个单独的关系。

例如,这可能服务器你最好:

<database name="default"> 
    <table name="category" phpName="Category"> 
    <column name="id"   type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="parent_id" type="integer" required="true" defaultValue="0"/> 
    <column name="root_id"  type="integer" required="true" defaultValue="0"/> 
    <column name="redirect_id" type="integer" required="false" defaultValue="null"/> 
    <column name="name"   type="varchar" size="255" required="true" defaultValue=""/> 
    <column name="status"  type="char" sqlType="enum('active','deleted','disabled')" required="true" defaultValue="active"/> 
    <foreign-key foreignTable="category" phpName="ParentCategory"> 
     <reference local="parent_id" foreign="id"/> 
    </foreign-key> 
    <foreign-key foreignTable="category" phpName="RedirectToCategory"> 
     <reference local="redirect_id" foreign="id"/> 
    </foreign-key> 
    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB"/> 
     <parameter name="Charset" value="utf8"/> 
    </vendor> 
    </table> 
</database> 

与查询

$categories = CategoryQuery::create('c') 
    ->filterByName("%{$name}%") 
    ->filterByStatus('active') 
    ->useParentCategoryQuery('p') 
     ->filterByStatus('active') 
    ->endUse() 
    ->find(); 

其中,in the Propel sandbox

SELECT category.ID, category.PARENT_ID, category.ROOT_ID, category.REDIRECT_ID, category.NAME, category.STATUS 
    FROM `category` 
    INNER JOIN `category` `p` ON (category.PARENT_ID=p.ID) 
    WHERE category.NAME LIKE '%myname%' 
    AND category.STATUS='active' 
    AND p.STATUS='active'