0

私はhttp://framework.zend.com/manual/2.1/en/modules/zend.form.collections.htmlをフォローしており、検証などでうまく機能します。

フォームが有効な場合、ガイドはエンティティに対してvar_dumpを実行するだけで、次のようになります。

object(Application\Entity\Product)[622]
  protected 'name' => string 'Chair' (length=5)
  protected 'price' => string '25' (length=2)
  protected 'categories' =>
    array (size=2)
      0 =>
        object(Application\Entity\Category)[615]
          protected 'name' => string 'Armchair' (length=8)
      1 =>
        object(App1ication\Entity\Category)[621]
          protected 'name' => string 'Office' (length=6)

カテゴリは2つ以上または1つだけにすることができます。通常のフォームをデータベーステーブルに保存する方法私は理解しており、問題はありません。ただし、ここには2つの異なるテーブルのデータがあります。コントローラでカテゴリを手動で読み取り、モデルに入力して行ごとに保存できると思います。しかし、それはそれを行うための最良の方法のようには感じません。

エンティティからモデルまたはデータベースにデータを取得するにはどうすればよいですか?Doctrineなしでそれを行うことはできますか?

4

1 に答える 1

1

2つの選択肢があります:getData()またはbind()

bind()これは「自動」の方法です。コレクションの名前と一致するエンティティのプロパティを持つフォームオブジェクトにエンティティをバインドします。次に、フォームのisValid()メソッドが呼び出されると、バインディングメカニズムは、コレクションの要素からエンティティの一致するプロパティに値を渡します。

getData()または、コレクションオブジェクトで使用して、必要な操作を行うこともできます。

エンティティを取得したら、それを保存するために、ZfcBaseの使用を検討してください。

これはマッパーの簡単な例です。

namespace MyModule\Mapper;

use ZfcBase\Mapper\AbstractDbMapper;
use Zend\Stdlib\Hydrator\ArraySerializable;
use MyModule\Entity\MyEntity;

class MyMapper extends AbstractDbMapper
{
    protected $tableName  = 'my_table';

    public function __construct()
    {
        $this->setHydrator(new ArraySerializable());
        $this->setEntityPrototype(new MyEntity());
    }

    public function save(MyEntity $entity)
    {
        if (!$entity->getId()) {
            $result = $this->insert($entity);
            $entity->setId($result->getGeneratedValue());
        } else {
            $where = 'id = ' . (int)$entity->getId();
            $this->update($entity, $where);
        }
    }

    public function fetchAll($choiceGroupId)
    {
        $select = $this->getSelect($this->tableName);
        return $this->select($select);
    }

    public function loadById($id)
    {
        $select = $this->getSelect($this->tableName)
                       ->where(array('id' => (int)$id));

        return $this->select($select)->current();
    }        
}

このマッパーはArraySerializableハイドレーターを使用しているため、エンティティオブジェクト(例では)はメソッドとをMyEntity実装する必要があります。保存するデータの配列を返し、データベースのデータの配列からエンティティを埋めるために使用されます。getArrayCopy()populate()getArrayCopy()populate()

于 2013-02-19T08:15:32.063 に答える