1

Cakephp で次のクエリを複製しようとしています。

SELECT *
FROM uploads, proposals
WHERE proposals.id = uploads.proposal_id AND proposals.tender_id = 10

次の条件で Upload モデルで find メソッドを使用しています。

$conditions = array(
  'Proposal.id' => $id,
  'AND' => array(
    'Upload.proposal_id' => 'Proposal.id'
  )
);
return($this->find('list', array('conditions' => $conditions)));

しかし、代わりにこのクエリを取得しています

SELECT `Upload`.`id`, `Upload`.`title` 
FROM `kumalabs_lic`.`uploads` AS `Upload` 
WHERE `Proposal`.`id` = 10 AND `Upload`.`proposal_id` = 'Proposal.id' 

ご覧のとおり、プロポーザル テーブルがありません。このクエリを作成する方法を教えてください。

ありがとう :)

4

3 に答える 3

1

これには、リンク可能な動作を使用することをお勧めします。CakePHPで結合を行うデフォルトの方法よりもはるかに簡単です。最新バージョンのCakePHPと1.3で動作します。

CakePHPのリンク可能な動作

次に、検索結果を次のように変更します。

return($this->find('list', array(
    'link' => array('Proposal'),
    'conditions' => array(
            'Proposal.id' => $id,
    ),
    'fields' => array(
            'Upload.*',
            'Proposal.*',
    ),
)));

CakePHPは自動的に主キー/外部キーに参加するので、

'Upload.proposal_id' => 'Proposal.id'

調子。

あなたはその条件を必要としませんが、私はあなたがあなたのそして間違ったことをしていることも指摘したいと思います。これは、CakePHPでANDおよびORを実行する方法です

        'conditions' => array(
                'and' => array(
                    'field1' => 'value1', // Both of these conditions must be true
                    'field2' => 'value2'
                ),
                'or' => array(
                    'field1' => 'value1', // One of these conditions must be true
                    'field2' => 'value2'
                ),
        ),
于 2012-10-18T15:23:52.350 に答える
0

'contain'モデルに関連付けがある場合、CakePHP は自動的にテーブルをキーワードで結合します。以下のコードを試してください:

public function getProposalsFromTender($id){
   $data = $this->find('all', array(
      'conditions' => array('Proposal.id' => $id),
      'fields' => array('Upload.*', 'Proposal.*'),
      'contain' => array('Proposal')
  ));
  return($data);
}

注: CakePHP は暗黙的な結合の代わりに明示的な結合を使用します。...from proposals, uploads...

于 2012-10-18T15:45:42.680 に答える
0

私はその JOIN 構文に慣れていませんが、次のようになると思います:

SELECT *
FROM uploads
INNER JOIN proposals ON proposals.id = uploads.proposal_id
WHERE proposals.tender_id = 10

...だから、これに似たものが必要です:

// Untested
$conditions = array(
    'Proposal.id' => $id,
    'joins' => array(
        array(
            'alias' => 'Proposal',
            'table' => 'proposals',
            'type' => 'INNER',
            'conditions' => 'Proposal.id = Upload.proposal_id',
        ),
    ),
);

もちろん、これは JOIN の直訳です。モデルが適切に関連付けられていれば、すべて自動的に行われます。

于 2012-10-18T15:16:09.217 に答える