在Propel2中,按空值过滤crossref

I use Propel2 orm.

I've 2 tables Entry and Category connected by a many-to-many relationship via an EntryCategory table.

I set isCrossRef on true in schema.xml.

Everything works fine : I'm able to filter entry by category like this :

EntryQuery::create()->filterByCategory($cat)

BUT

I'm not able to filter entries with no category. I tried

EntryQuery::create()->filterByCategory(null, Criteria::EQUAL)

or

EntryQuery::create()->filterByCategory(null, Criteria::ISNULL)

but, it gives me

'filterByCategory() only accepts arguments of type \Category or Collection'

I also tried

EntryQuery::create()->where('Category IS NULL')

but, i've got this error

Unknown column 'Category' in 'where clause'

So, I need some help ...

EDIT :

Extract of my schema.xml :

<?xml version="1.0" encoding="utf-8"?>
<database package="core" name="bank" identifierQuoting="true" defaultIdMethod="native" defaultPhpNamingMethod="underscore">
  <table name="category" idMethod="native" phpName="Category">
    <column name="id" phpName="Id" type="INTEGER" size="5" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="name" phpName="Name" type="VARCHAR" size="50" required="true"/>
    <column name="parent_id" phpName="ParentId" type="INTEGER" size="5"/>
    <foreign-key foreignTable="category" phpName="Parent">
      <reference local="parent_id" foreign="id"/>
    </foreign-key>
    <index name="parent_id">
      <index-column name="parent_id" size="5"/>
    </index>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
  <table name="entry" idMethod="native" phpName="Entry">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="account_id" phpName="AccountId" type="INTEGER" required="true"/>
    <column name="date" phpName="Date" type="DATE" required="true"/>
    <column name="entry" phpName="Entry" type="VARCHAR" size="255" required="true"/>
    <column name="type" phpName="Type" type="INTEGER" size="2"/>
    <column name="amount" phpName="Amount" type="DECIMAL" size="12" scale="2" required="true"/>
    <index name="account">
      <index-column name="account_id"/>
    </index>
    <index name="md5">
      <index-column name="md5" size="32"/>
    </index>
    <index name="md5_2">
      <index-column name="md5" size="32"/>
      <index-column name="account_id"/>
    </index>
    <foreign-key foreignTable="account">
      <reference local="account_id" foreign="id"/>
    </foreign-key>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
  <table name="entry_category" idMethod="native" phpName="EntryCategory" isCrossRef="true">
    <column name="entry_id" phpName="EntryId" type="INTEGER" primaryKey="true" required="true"/>
    <column name="category_id" phpName="CategoryId" type="INTEGER" size="5" primaryKey="true" required="true"/>
    <foreign-key foreignTable="entry" name="entry_category_ibfk_1">
      <reference local="entry_id" foreign="id"/>
    </foreign-key>
    <foreign-key foreignTable="category" name="entry_category_ibfk_2">
      <reference local="category_id" foreign="id"/>
    </foreign-key>
    <index name="category_id">
      <index-column name="category_id" size="5"/>
    </index>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
</database>

You need to use the Id or Name or whatever the column name is.

->filterByCategory expects a propel object of the category type.
->filterByCategoryId() or whatever the name for the actual column is. (having your schema would be beneficial)

Not passing anything sets it up to look for null. Anything else is handled as a string literal. where column = 'null'


Use either ->filterByCategory() (if that is the name of your column and NOT a foreign key reference) or ->filterByCategoryId() if 'CategoryId' is the 'phpName' of the column.