質問

私は、Zend Frameworkを使用して開発されたアプリケーションに取り組んでいます。モデルでリレーションシップを定義し、それらを楽しく使用できます。例:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

ただし、行セットが返される列名が「People」と「Jobs」で同じであるため、配列キーがマージされ、最終行セットのデータの一部が失われるという問題が発生しました。

Zend_Db_Select オブジェクトをパラメーターの1つとして findManyToManyRowset()に渡すことができますが、この場合の使用方法を説明するドキュメントが見つかりません例:

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

上記のコードを使用しようとすると、次のようなメッセージが表示されます:

Error: No reference rule "" from table People to table Jobs

これをどのように行うべきかについて、誰かが私を啓発できますか?データベース内の列名を変更できることはわかっていますが、DB構造を再設計し、関連するすべてのコードを更新するのではなく、コードを変更することをお勧めします。

注:上記のような列エイリアスの形式がない場合、返される行セットは次のようになります(つまり、同じ名前の列をマージします):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

乾杯、
  マット

役に立ちましたか?

解決

最初の推奨事項は、 id code などの一般的な名前の列に名前を付けないことです。これらの名前は無意味であり、あなたが発見したように、連想配列で結果をフェッチするときに衝突も発生します。

また、選択インターフェイスを誤って使用しています。 from()呼び出しまたは join()呼び出しごとに1つのテーブルのみを指定する必要があります。

最後に、 Zend_Db_Table リレーションシップインターフェイスを介して複雑なクエリを実行しようとはしません。単純なケースのみを対象としています。より複雑なクエリがある場合は、SQLクエリを明示的に記述してください。

方法もご覧ください。 ZFテーブルインターフェイスで結合クエリを実行するにはどうすればよいですか

他のヒント

この答えは少し遅れていることは知っていますが、いくつか指摘しておくべきことがあります。

1) findManyToManyRowset($ matchTable、$ intersectionTable、$ callerRefRule、$ matchRefRule、$ select); -必要な Zend_Db_Table_Select を渡す場合ルールに null を渡します。

2) findManyToManyRowset()に渡された Zend_Db_Table_Select は、 $ matchTable から作成する必要があります。句 i は交差テーブルのエイリアスで、 m はマッチテーブルのエイリアスです。

3)衝突の場合、 m はphpで返される連想配列のキー名を獲得します。実行されるクエリは次のようになります。

  SELECT 
    `i`.*, `m`.* 
  FROM 
    `interscetTable` AS `i` 
  INNER JOIN 
    `matchTable` AS `m` 
  ON
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)  

4)何があっても、 findManyToManyRowset()の戻り値は $ matchTable から作成された行セットになります。交差テーブル、マッチテーブルのデータもキャプチャしますが、おそらくカスタム Zend_Db_Select が必要であり、 Zend_Db_Table を使用してデータをマッピングすることは避けてください。

だから" People"を使用した実例マッチテーブルとして、「Workers」交差テーブルとして、「クライアント」と言うことができます。元のテーブルとして..この例では、テーブルが次のようにリンクしていると仮定しています  People。 id:... -> workers。 person_id:client_id:job_id -> clients: id:...

$client = $clientTable->fetchRow(); /// grab a random client

// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('i.hiredate')); 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top