0

OrderDetail と Item の 2 つのモデル、多対 1 の関係の次のサンプル スキーマがあります。

OrderDetail:
  columns:
    invoice_id: { type: integer, notnull: true }
    item_id: { type: integer, notnull: true }
    quantity: { type: integer, notnull: true }
    transaction_price: { type: integer }
    currency: { type: string(50), default: peso }
  relations:
    Invoice: { type: one, local: invoice_id, foreign: invoice_id }
    Item: { type: one, local: item_id , foreign: item_id }
  indexes:
    invoice_to_item:
      fields: [item_id, invoice_id]
      type: unique

Item:
  actAs: { Timestampable: ~, SoftDelete: ~ }
  columns:
    item_id: { type: integer, autoincrement: true, primary: true }
    item_name: { type: string(100), notnull: true }
    description: { type: text, notnull: true }
    part_number: { type: string(50) }
    size: { type: string(50) }
    unit: { type: string(10) }
    in_stock: { type: integer, notnull: true }
    in_transit: { type: integer, notnull: true }
    released: { type: integer, notnull: true }
    borrowed: { type: integer, notnull: true }
    borrower_name: { type: string }
    item_type_id: { type: integer, notnull: true }
  relations:
    OrderDetails: { type: many, class: OrderDetail, local: item_id, foreign: item_id }
    Prices: { type: many, class: Price, local: item_id, foreign: item_id }

item_nameフォームに、やなどの Item テーブルの情報を含めたいと考えていますin_stock。単純にやりたいことは、フォームに関連する Item テーブルのデータを表示したいということです。わかりやすく整理するために、この情報をフォーム オブジェクトに含めたいと思います。私は自分のフォームでこのようなことをできるようにしたい:

echo $form[$number]['Item']['part_number']->getValue()
// where $number is the index of the OrderDetail in the form and key 'Item' contains data for the Item related to this OrderDetail.

次のような OrderDetail に Item リレーションを埋め込んでみました。

class OrderDetailForm extends BaseOrderDetailForm {

    public function configure() {
        // some config here...

        $this->embedRelation('Item');
    }
}

これに関する問題は、フォームを保存すると、Item オブジェクトが検証されて保存されることです。私は単に表示目的でその情報を使用しています。これは、フォームをどのようにしたいのか、何をしたいのかの大まかなサンプルです。

OrderDetail: 1
Item: Headset
In Stock: 5pcs
Quantity: [input field here that can be changed by the user]

ご不明な点がございましたら、お知らせください。また、より良いアプローチを提案できる場合は、本当に感謝しています。

4

1 に答える 1

1

OrderDetailForms が InvoiceForm 内に埋め込まれており、これらから Item オブジェクトにアクセスする場合。次に、テンプレートで次のようなものを使用することをお勧めします。

// apps\myApp\modules\myModule\templates\editSuccess.php
$orderDetailForms = $invoiceForm->getEmbeddedForms();

foreach ($orderDetailForms as $key => $form) {
    $item = $form->getObject()->getItem();

    echo 'Item name: ' . $item->getItemName() . '<br />';
    echo 'In stock: ' . $item->getInStock() . '<br />';
    echo $form;
}

ここで行うことは、クエリを実行するときに Item オブジェクトが OrderDetail オブジェクトと共に取得されることを確認することです。その行 ($form->getObject()->getItem()) は毎回データベースクエリを効果的に実行するためです。

于 2013-04-14T14:55:23.320 に答える