スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    Symfony Advent Calendar JP 2012 day 12 - symfony1とSymfony2でmany to manyを保存するフォーム・モデルの書き方比較

    0
      Symfony Advent Calendar JP 2012 12日目の記事です。

      symfony1+doctrine1では多対多のリレーションを扱うために、中間のリレーションテーブルを別途自前でモデルとして定義する必要がありました。
      たとえば、UserとGroupの多対多を扱うためには、UserGroupモデルを作り、User-UserGroup,Group-UserGroupの二つの一対多として扱うのです。
      https://github.com/doctrine/doctrine1-documentation/blame/master/source/ja/manual/defining-models.rst#L878

      当然の帰結として、フォームを書くときも自前です。
      UserFormにGroupのチェックボックス(又はmultipleなselect)を追加し(ここまでは簡単)、Group.idの配列からUserGroupを作って保存する処理(ここが面倒)を実装しなければなりませんでした。

      一方Symfony2+Doctrine2では多対多のリレーション専用の書き方が決められています。
      エンティティにアノテーションで書くと下記のようになります。
      #Acme/DemoBundle/Entity/User.php

      use Doctrine¥ORM¥Mapping as ORM;
      use Doctrine¥Common¥Collections¥ArrayCollection;

      class User
      {

          /**
           * @ORM¥ManyToMany(targetEntity="Group")
           * @ORM¥JoinTable(name="users_groups",
           *      joinColumns={@ORM¥JoinColumn(name="user_id", referencedColumnName="id")},
           *      inverseJoinColumns={@ORM¥JoinColumn(name="group_id", referencedColumnName="id")}
           *      )
           **/
          private $groups;

          public function __construct()
          {
              $this->groups = new ArrayCollection();
          }

      yml,xmlでの書き方はDoctrine2のmappingのドキュメントを参照してください。
      http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional

      そして、嬉しいことに、このエンティティをdataとして指定してフォームを作ると、今まで手動で実装していた
      *多対多の相手先のチェックボックス又はmultipleなコンボボックス
      *リレーションテーブルへの保存
      を自動でやってくれるのです。

      #Acme/DemoBundle/Form/UserType.php
      class UserType extends AbstractType
      {
          public function buildForm(FormBuilderInterface $builder, array $options)
          {
              $builder
                  ->add('groups', 'entity', array(
                      'class' => 'AcmeDemoBundle:Group',
                      'expanded' => true,  //checkboxにしたければtrue,multiple selectにしたければfalse←symfony1でのsfWidgetFormDoctrineChoiceと同じ
                      'multiple' => true,
                  ));
          }
      }
      とても簡単ですね:D
      怠け者の私がこれだけのために今後はsymfony1でなくSymfony2を提案しようと思ってしまったぐらいでした。



      スポンサーサイト

      0

        • 2014.12.23 Tuesday
        • -
        • 11:38
        • -
        • -
        • -
        • -
        • by スポンサードリンク

        コメント
        コメントする








           

        PR

        calendar

        S M T W T F S
           1234
        567891011
        12131415161718
        19202122232425
        2627282930  
        << November 2017 >>

        twitter

        selected entries

        categories

        archives

        recent comment

        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
          プログラマー
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          ななうぇぶ
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • WindowsのPCで開発するphperがxhprofを使う方法
          ななうぇぶ
        • WindowsのPCで開発するphperがxhprofを使う方法
          川本
        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
          よし
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          77web
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          ktz

        recent trackback

        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
          常山日記
        • django対symfony 日本語メール送信(その1 symfony編)
          CPA-LABテクニカル
        • CodeIgniterでユーザー認証
          されどLAMPな日々
        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
          常山日記
        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
          サーバー用語集
        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
          常山日記
        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
          mitszoの日記
        • python多次元リストをsort(並べ替え)する方法?
          mitszoの日記
        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
          Humming Via Kitchen
        • 日本語テキストをtruncate@django(Python全般にも??)
          常山日記

        recommend

        links

        profile

        search this site.

        others

        mobile

        qrcode

        powered

        無料ブログ作成サービス JUGEM