2

我有一张这样的证券表:

CREATE TABLE IF NOT EXISTS `securities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ticker` varchar(36) NOT NULL,
  `name` varchar(180) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ticker` (`ticker`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=585 ;

即主键是id同时有另一个唯一索引ticker

ticker索引是指我的另一个表 secuity_prices 有这个

CREATE TABLE IF NOT EXISTS `security_prices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `price_date` date NOT NULL,
  `ticker` varchar(36) NOT NULL,
  `price` decimal(10,6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=88340 ;

我想在它们之间定义一个 hasMany 关系,这样 security hasMany securityPrice [securityPrice belongsTo security]。

我遇到的问题是 Cake 使用主键security链接到security_prices表而不是ticker字段。我怎样才能通过代码进行加入?

以下是我的人际关系:

//Security
  public $hasMany = array(
    'SecurityPrice' => array(
        'className' => 'SecurityPrice',
        'foreignKey' => 'ticker',
        )
    );

//SecurityPrice
public $belongsTo = array(
        'Security' =>
            array(
                'className' => 'Security',
                'foreignKey' => 'ticker',
            )
    );
4

1 回答 1

2

您不能使用 $hasMany 来执行此操作,因为这些关联要求您遵循 Cake 的主键命名约定。您正在尝试通过非主键列连接两个表。这可以做到,但不能通过 Cake 的自动关联。

执行查找操作或分页操作时需要添加连接条件。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables

$options['joins'] = array(
    array('table' => 'security_prices',
        'alias' => 'SecurityPrice',
        'type' => 'LEFT',
        'conditions' => array(
            'Security.ticker = SecurityPrice.ticker',
        )
    )
);

$Security->find('all', $options);

如果您必须经常这样做,那么您应该创建一个自定义查找类型。

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#creating-custom-find-types

class Security extends AppModel {
   public $findMethods = array('ticker' =>  true);

   protected function _findTicker($state, $query, $results = array()) {
      if ($state === 'before') {
          $query['joins'][] = array(
              array('table' => 'security_prices',
                  'alias' => 'SecurityPrice',
                  'type' => 'LEFT',
                  'conditions' => array(
                      'Security.ticker = SecurityPrice.ticker',
                  )
              )
          );
          return $query;
       }
      return $results;
   }
}

然后稍后很容易找到加入。

 $Security->find('ticker',.....);
于 2013-09-30T11:23:25.993 回答