Phalconでformに複数のentity(model)を設定する方法をメモ。
ちなみに今回試したPhalconのバージョンはPhalcon5。
RobotsモデルとCategoryモデルがあり、その2つのモデルの値をEditFormに設定するパターンで記載します。
2つのやり方で実現できたので2つ例を挙げます。
マージパターン
$robots = Robots::findFirst($robotsId); $category = Category::findFirst($robots->category_id); $form = new EditForm((object) array_merge($robots->toArray(), $category->toArray()));
RobotsとCategoryそれぞれの値を取ってきて、array_merge()してFormに値を設定します。
Formに配列を渡せないので、array_mergeした配列を(object)でキャストする必要があります。
createBuilderパターン
$result = $this->modelsManager->createBuilder() ->columns([ 'Robots.robots_id', 'Robots.robots_name', 'Category.category_name', ]) ->addFrom('App\Models\Robots', 'Robots') ->innerJoin('App\Models\Category', 'Robots.category_id = Category.category_id', 'Category') ->where('Robots.robots_id = :robots_id:', ['robots_id' => $robotsId]) ->getQuery() ->getSingleResult(); $form = new DirectManifestForm($result);
「$this->modelsManager->createBuilder()」でまとめてDBから値を取ってきて、Formに値を設定するパターン。
注意点としては、columns()でカラムを指定すること。
カラムを指定しなかったり、「*」ですべてのカラムを持ってくるとうまく値を代入できません。
->columns([ 'Robots.*', 'Category.*', ])
のようにすると、「$result->Robots->robots_id」や「$result->Category->category_name」のようにしないと値を取得できないので、Formに値を設定できないようです。