2017-02-21 46 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%' 

Propel генерируемых методы модели я использую:

$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' 

 Смежные вопросы

  • Нет связанных вопросов^_^