2

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
    )

乾杯、
マット

4

2 に答える 2

2

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

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); -- 合格している場合は、ルールZend_Db_Table_Selectに合格したいと思うでしょう。null

2) にZend_Db_Table_Select渡される はfindManyToManyRowset()から作成する必要があり、where 句で が交差テーブルのエイリアスであり、マッチ テーブルのエイリアスである$matchTableと想定しても安全です。im

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()から作成された Rowset になる$matchTableため、交差するテーブルから情報をキャプチャする必要がある場合は、マッチ テーブルのデータもキャプチャする必要がありますZend_Db_SelectZend_Db_Tableとにかく、データをマップするためにものを使用しないでください。

したがって、「People」を一致テーブルとして使用し、「Workers」を交差テーブルとして使用し、元のテーブルとして「Clients」としましょう。この例では、テーブルが次のようにリンクしていると仮定します。id:...-> 労働者。person_id:client_id:job_id-> クライアント: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')); 
于 2010-02-25T21:18:00.570 に答える
1

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

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

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

ZF テーブル インターフェイスで結合クエリを実行する方法も参照してください。

于 2009-10-10T19:53:41.743 に答える