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に値を設定できないようです。
