Zend Frameworkの関係-findManyToManyRowset()で列名を定義しますか?
-
08-07-2019 - |
質問
私は、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クエリを明示的に記述してください。
他のヒント
この答えは少し遅れていることは知っていますが、いくつか指摘しておくべきことがあります。
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'));