web-dev-qa-db-ja.com

1つのレコードの2つの左結合と複数の親

この問題は、リンク joomla.stackexchange.com/a/9836/4042 による質問の拡張ですが、子レコードに親(親レコード)が1つだけでなく、多数ある場合の条件があります。

そのリンクによって受け入れられた回答からの2つの左結合を使用すると、子レコードに親が1つしかない(または、多くの子が同じ1つの親にバインドされている)場合に完全に機能します。しかし、1つの子レコードが複数の親(親レコード)にバインドされている場合はどうでしょうか。つまり:

#__ records:

id  name
1   Child1
2   Parent1
3   Parent2

#__ parents:

id  child_id  parent_id
1       1         2
2       1         3

この場合、その2つの左結合を使用して、各parent_nameのバックエンドにあるレコードのリストで同じ子レコードを2回取得します。

ID  CHILD    PARENT
1   Child1   Parent1
1   Child1   Parent2

したがって、2つの質問があります。

1。parent_nameをarray()にプッシュして取得する方法私のコンポーネントのバックエンドにある子レコードのリスト(ifadministrator/index.php?com_mycom&view = recordS)のように:

ID CHILD   PARENT
1  Child1  Parent1, Parent2

2。単一のレコードを編集するためのフォームで親の配列を持つフィールドを取得する方法と、DBにフィールドを(再)保存する方法( ifadministrator/index.php?com_mycom&view = record&layout = edit&id = 1)?私のadmin/models/forms/record.xmlに次のようなフィールドを追加しようとします:

<field 
    name="parentheader"
    type="list"
    label="COM_MYCOM_PARENT"
    description=""
    class="chzn-color-state"
    multiple="multiple">
    <option value="0">COM_MYCOM_SELECT_PARENT</option>
</field>

これをtmplでレンダリングするには:

JHtml::_('formbehavior.chosen', 'select');
...
<div class="control-group">
   <div class="control-label">
      <?php echo $this->form->getLabel('parentheader'); ?>
   </div>
   <div class="controls">
     <?php echo $this->form->getInput('parentheader'); ?>
   </div>
</div>

しかし、私はこの出力を取得します: enter image description here

これは、Virtuemartの製品編集パネルのカテゴリーのフィールドのようである必要があります。ここで、製品を多くのカテゴリーにバインドできます。

enter image description here

admin/models/forms/record.xmlおよびadmin/models/recordにどのコードを追加する必要がありますか? php(またはJTableクラス)?

1
stckvrw

第1四半期(SQLの問題)に対する回答をお手伝いします。

これが私が sqlfiddle で使用したSQLです。

SELECT
  b.`child_id`,
  a.`name`,
  GROUP_CONCAT( c.`name` ORDER BY c.`name` SEPARATOR ', ') AS parents
FROM `a_parents` AS b
INNER JOIN `a_records` AS a ON a.`id`=b.`child_id`
INNER JOIN `a_records` AS c ON c.`id`=b.`parent_id`
GROUP BY b.`child_id`;

次のことを前提としています。

  • あなたは親を持つそれらの子だけに興味があります(したがって、親テーブルは「Origin」です(好きな場合-child_idによるグループ化)。
  • それは3人以上の親に対応する必要があります(これは人間の祖先に関するものではないという前提で、それ以外の場合、3部/多部の親子関係は、stackexchangeの範囲をはるかに超えています!)
  • 親の名前の長さの合計は1024以下です(もしそうであれば、次のようにする必要があります:

    SET group_concat_max_len = 1024 * 10;

たとえば、10Kに設定するには-これが行われますbeforeSELECT)

  • エイリアスcは、親の名前をparent_idにマッピングできるようにするために使用されます
  • MySQL 5.5以降の使用-以前のバージョンでも機能する場合があります

ここでの解決策の要点は GROUP_CONCAT の使用です。これにより、多くの行を単一の列に「変換」するためのPHP配列処理を実行する必要がなくなります。


2番目の質問(Q2)については、おそらくカスタムフィールドハンドラーを記述する必要があります。あなたが言わないように私は推測していますが、スクリーンショットを撮る方法でVMを使用している場合、それはJ2.5ではなくJ2.5のように見えます)、たくさんの例がありますVM2が独自の特別なフィールドを使用する場所の例(例としては、administrator /.../ elementsを参照してください。正しく思い出せば、administrator /.../ models/fieldsも参照できます) カスタムバックエンドを作成するためのリンクフィールドが役立つかもしれません

2
Mark Bradley