phalconで1つのformに複数のentity(model)の値を設定

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