我使用Propel2 orm。
我有两个表条目和类别,通过一个EntryCategory表通过多到多的关系连接.
我将isCrossRef设置为schema.xml中的true。
一切正常:我能够按类别过滤条目,如下所示:
EntryQuery::create()->filterByCategory($cat)但
我无法在没有类别的情况下过滤条目。我试过了
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>发布于 2015-04-29 23:30:29
您需要使用Id或名称或任何列名。
->filterByCategory需要一个类别类型的propel对象。
->filterByCategoryId()或任何实际列的名称。(拥有您的模式将是有益的)
不传递任何东西会将其设置为查找null。其他任何内容都以字符串文本的形式处理。where column = 'null'
使用->filterByCategory() (如果这是列的名称而不是外键引用)或使用->filterByCategoryId() (如果'CategoryId‘是列的'phpName’)。
发布于 2021-01-05 17:56:15
好的,我找到了两个解决方案(是的,5年后;)
EntryQuery::create()->leftJoinCategory->where('Category.CategoryId IS NULL')或
EntryQuery::create()->useCategoryQuery(null, Criteria::LEFT_JOIN)->filterByCategoryId(null, Criteria::ISNOTNULL)->endUse();https://stackoverflow.com/questions/29810570
复制相似问题