使用 Propel ORM 在 3 个表上加入

Posted

技术标签:

【中文标题】使用 Propel ORM 在 3 个表上加入【英文标题】:JOIN on 3 tables with Propel ORM 【发布时间】:2011-01-31 15:46:52 【问题描述】:

我的一个客户要发布一个新产品,负责编码的开发人员离开了项目(完成了 85%)。

需要使用 Propel ORM 执行自定义 SQL 查询。查询如下:

$sql = "SELECT
    `domain`.*,
    `domain_registrar`.`name` AS `registrar_name`,
    `domain_account`.`id` AS `account_id`,
    `domain_account`.`username` AS `account_username`,
    DATEDIFF(`domain`.`expire_date`, NOW()) AS `days_to_expiration`

FROM
    `domain`
    LEFT JOIN `domain_account` ON `domain_account`.`id`=`domain`.`domain_account_id`
    LEFT JOIN `domain_registrar` ON `domain_registrar`.`id`=`domain_account`.`domain_registrar_id`

ORDER BY
    `days_to_expiration`,
    `domain_registrar`.`name`,
    `domain_account`.`username`,
    `domain`.`domain`";

我对推进 ORM 有非常基本的了解,所以我认为任何专家都可以帮助我解决它。 db方案如下:

<table name="domains" phpName="Domains">
    <column name="id" type="INTEGER" required="true" primaryKey="true" autoIncrement="true" />
    <column name="account_id" type="INTEGER" required="true" />
    <column name="domain" type="VARCHAR" size="255" required="true" />
    <column name="expiration" type="DATE" />
    <foreign-key foreignTable="domain_accounts" phpName="DomainAccounts" refPhpName="Domains">
      <reference local="account_id" foreign="id" />
    </foreign-key>
  </table>
  <table name="domain_accounts" phpName="DomainAccounts">
    <column name="id" type="INTEGER" required="true" primaryKey="true" autoIncrement="true" />
    <column name="registrar_id" type="INTEGER" required="true" />
    <column name="username" type="VARCHAR" size="255" required="true" />
    <column name="password" type="VARCHAR" size="255" required="true" />
    <foreign-key foreignTable="domain_registrars" phpName="DomainRegistrars" refPhpName="DomainAccounts">
      <reference local="registrar_id" foreign="id" />
    </foreign-key>
  </table>
  <table name="domain_registrars" phpName="DomainRegistrars">
    <column name="id" type="INTEGER" required="true" primaryKey="true" autoIncrement="true" />
    <column name="value" type="VARCHAR" size="255" required="true" />
  </table>

【问题讨论】:

这是什么版本的 Propel? Propel 1.5 引入了Query 类来扩充Peer 类,这为您提供了不同的语法。 (如果您在回复中使用@Jan,我会收到通知) 【参考方案1】:

在 Propel 1.5 中,它会变成这样(未经测试,从我的脑海中):

DomainsQuery::create()
    ->joinWith( 'Domains.DomainAccounts' )
    ->joinWith( 'Domains.DomainRegistrars' )
    ->withColumn( 'DATEDIFF(`domain`.`expire_date`, NOW())', 'DaysToExpiration' );  

【讨论】:

以上是关于使用 Propel ORM 在 3 个表上加入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Propel ORM 在数据库中查找重复条目?

为啥我不能在其他类或函数中使用我的 Propel ORM 类?

PHP ORM:Doctrine vs. Propel

Propel ORM - 连接不相关的表

如何将 Propel orm 视为查询类?

如何获取相关对象 Propel ORM