この問題は、リンク 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>
しかし、私はこの出力を取得します:
これは、Virtuemartの製品編集パネルのカテゴリーのフィールドのようである必要があります。ここで、製品を多くのカテゴリーにバインドできます。
admin/models/forms/record.xmlおよびadmin/models/recordにどのコードを追加する必要がありますか? php(またはJTableクラス)?
第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`;
次のことを前提としています。
親の名前の長さの合計は1024以下です(もしそうであれば、次のようにする必要があります:
SET group_concat_max_len = 1024 * 10;
たとえば、10Kに設定するには-これが行われますbeforeSELECT)
ここでの解決策の要点は GROUP_CONCAT の使用です。これにより、多くの行を単一の列に「変換」するためのPHP配列処理を実行する必要がなくなります。
2番目の質問(Q2)については、おそらくカスタムフィールドハンドラーを記述する必要があります。あなたが言わないように私は推測していますが、スクリーンショットを撮る方法でVMを使用している場合、それはJ2.5ではなくJ2.5のように見えます)、たくさんの例がありますVM2が独自の特別なフィールドを使用する場所の例(例としては、administrator /.../ elementsを参照してください。正しく思い出せば、administrator /.../ models/fieldsも参照できます) カスタムバックエンドを作成するためのリンクフィールドが役立つかもしれません