繁体   English   中英

在Propel2中,通过空值过滤crossref

[英]In Propel2, filter crossref by null value

我使用Propel2 orm。

我有 2 个表 Entry 和 Category 通过 EntryCategory 表通过多对多关系连接。

我在 schema.xml 中将 isCrossRef 设置为 true。

一切正常:我可以像这样按类别过滤条目:

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

我无法过滤没有 category 的条目。 我试过

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>

您需要使用 Id 或 Name 或任何列名称。

->filterByCategory需要一个类别类型的推进对象。
->filterByCategoryId()或实际列的任何名称。 (拥有您的架构将是有益的)

不传递任何内容将其设置为查找空值。 其他任何内容都作为字符串文字处理。 where column = 'null'


使用->filterByCategory() (如果这是您的列的名称而不是外键引用)或->filterByCategoryId()如果“CategoryId”是列的“phpName”。

好的,我找到了 2 个解决方案(是的,5 年后;))

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

或者

EntryQuery::create()->useCategoryQuery(null, Criteria::LEFT_JOIN)->filterByCategoryId(null, Criteria::ISNOTNULL)->endUse();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM