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 ;

security hasMany securityPrice [securityPrice belongsTo security] のように、それらの間の hasMany 関係を定義したいと考えています。

私が抱えている問題は、Cake がフィールドの代わりに主キーを使用してテーブルにsecurityリンクしていることです。ティッカーを介して結合を行うにはどうすればよいですか?security_pricesticker

ここに私の関係があります:

//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 の命名規則に従う必要があるためです。非主キー列を介して 2 つのテーブルを結合しようとしています。これは可能ですが、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/retriving-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 に答える