我使用Propel2 orm。
我有2个表条目和类别通过EntryCategory表以多对多关系连接。
我在schema.xml中将isCrossRef设置为true。
一切正常:我能够按类别过滤条目:
EntryQuery::create()->filterByCategory($cat)
BUT
我无法过滤没有类别的条目。我试过了
EntryQuery::create()->filterByCategory(null, Criteria::EQUAL)
或
EntryQuery::create()->filterByCategory(null, Criteria::ISNULL)
但是,它给了我
'filterByCategory() only accepts arguments of type \Category or Collection'
我也试过
EntryQuery::create()->where('Category IS NULL')
但是,我有这个错误
Unknown column 'Category' in 'where clause'
所以,我需要一些帮助...
编辑:
我的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>
答案 0 :(得分:0)
您需要使用Id或Name或列名称。
->filterByCategory
期望类别类型的推进对象
->filterByCategoryId()
或实际列的名称。 (让您的架构有益)
不传递任何内容会将其设置为null。其他任何东西都作为字符串文字处理。 where column = 'null'
使用->filterByCategory()
(如果这是列的名称而不是外键引用)或->filterByCategoryId()
如果'CategoryId'是列的'phpName'。
答案 1 :(得分:0)
好的,我找到了 2 个解决方案(是的,5 年后;))
EntryQuery::create()->leftJoinCategory->where('Category.CategoryId IS NULL')
或
EntryQuery::create()->useCategoryQuery(null, Criteria::LEFT_JOIN)->filterByCategoryId(null, Criteria::ISNOTNULL)->endUse();