0

従業員モデルをBladeテンプレートにバインドしており、熱心なロード リレーションの結果をフィールドに配置したいと考えています。

私のコントローラーでは、ページのコレクションを次のように構築します。

$employee = User::with('country', 'activeOrganisationRole')->first();

私のフォームオープンステートメントは次のとおりです。

{!! Form::model($employee, ['route' => ['employee.role', $employee->uuid], 'method' => 'POST']) !!}

$employee->country->nameしたがって、入力ステートメントに入力したいのですLaravel Collective form::textが、国名を読み込むことができません。フォームの他のすべてのフィールドは、親コレクションから完全に読み込まれます。

私の国のフィールドは次のとおりです。

<div class="form-group">
    <label for="phone" class="control-label">Country</label>
    {!! Form::text('country', null, ['id'=>'country', 'placeholder' => 'Country', 'class' => 'form-control']) !!}
</div>

上記の国フィールドは、リレーション結果全体を入力にロードします。injecting $employee->country->nameこの入力への正しい構文は何ですか?

ところで、これは完全に機能しますが、この方法で何も学んでいません!

<label for="title" class="control-label">Country</label>
<input id="country" class="form-control" value="{!! $employee->country->country !!}" readonly>
4

1 に答える 1

1

LaravelCollectiveFormBuilderdata_get(Laravel ヘルパー関数) を使用してオブジェクトから属性を取得すると思います。ただし、要素の名前のドットはちょっと変なので、ソースを少し掘り下げました。

次のいずれかの選択肢があります (私の好みで並べ替えました)。

  1. getFormValueEmployee モデルで呼び出されるメソッドを追加できます。これは、値を要求しているフォーム要素の名前である単一のパラメーターを取ります。次のように実装します。

    public function getFormValue($name)
    {
        if(empty($name)) {
            return null;
        }
    
        switch ($name) {
            case 'country':
                return $this->country->country;
        }
    
        // May want some other logic here:
        return $this->getAttribute($name);
    }
    

    これに関するドキュメントを実際に見つけることができませんでした(Laravelの場合はそうです)。ソースをトロールして見つけただけですが、PhpStorm Shamless Plugを使えば簡単です。

    これの欠点は、変換を失い、従業員オブジェクトから値を抽出しようとすることですdata_get

  2. テキスト フィールドの名前を に変更しますcountry[country]。ソースでは、ビルダーは '[' と ']' を '.' に置き換えます。オブジェクトで属性を検索する場合は、それぞれ「」および「」。これはdata_get、 が検索されることを意味しcountry.countryます。

  3. 将来この問題が発生する人のためにここに記載しますが、お勧めしません

    getCountryAttribute従業員モデルにメソッドを与えます。ドキュメントの「フォーム モデル アクセサー」の見出しで説明されているように、$employee->country から返されるものを上書きできます。これは、実際のオブジェクトにアクセスできないことを意味します。

于 2016-04-17T08:26:28.863 に答える