簡體   English   中英

以一種形式在 laravel nova 中添加來自關系的字段文本

[英]Add field text from relationship in laravel nova in ONE form

我是 Laravel Nova 的新用戶。 我正在嘗試構建一個用戶表單。 此刻我有這些模型: User、UserDetail

在用戶中我有:email,密碼,用戶名。 在 UserDetail 中,我有:姓名、姓氏、性別、號碼等。

現在我將為用戶創建一個表單。 為什么我專注於一個 因為在我的用戶資源字段中我有:

HasOne::make("UserDetail", "details"),

但是對於設置用戶詳細信息,我有 2 種形式:一種用於用戶數據(用戶名、密碼、電子郵件),保存用戶后我可以設置詳細信息。

所以我不想為 1 種資源編譯 2 種不同的形式。

我找到了這個 package,但似乎壞了:

https://github.com/yassipad/laravel-nova-nested-form/issues/66

並且未顯示 UserDetails 字段。

那么有沒有其他方法可以從關系中添加文本字段並合並到同一個表單中?

你可以通過使用Laravel的訪問器和mutator來解決這個問題。

在這個例子中,我只會從UserDetail添加gender ,因為我很懶。 因此,我們首先在User模型中添加性別訪問器

public function details()
{
    return $this->hasOne(UserDetail::class);
}

public function getGenderAttribute()
{
    return $this->details->gender ?? null;
}

此getter將從詳細信息中獲取性別,如果不存在任何詳細信息,則為null。

現在我們在Nova中為User資源添加一個新字段。

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        Gravatar::make(),

        Text::make('Name')
            ->sortable()
            ->rules('required', 'max:255'),

        Text::make('Email'),

        Password::make('Password'),

        Text::make('Gender')
            ->rules('required'),
    ];
}

轉到創建用戶表單,它看起來像這樣:

在此輸入圖像描述

當然這不會使它保存,因為它不知道如何處理gender領域。 為了處理這個問題,我們覆蓋了fillFields方法。

protected static function fillFields(NovaRequest $request, $model, $fields)
{
    // Get all of our user details data
    $userDetails = $request->only(['gender']);

    // Remove them from the request
    $request->request->remove('gender');

    $result = parent::fillFields($request, $model, $fields);

    // Insert them in the details object after model has been saved.
    $result[1][] = function () use ($userDetails, $model){
        $model->details()->updateOrCreate(
            [],
            $userDetails
        );
    };

    return $result;
}

現在我們可以將性別字段視為用戶的正常字段,而不需要UserDetail資源。 要在用戶詳細信息表中添加要保存的更多字段,我們必須將它們添加到我們的唯一中並從我們的請求中刪除它們。 (在數組中有這個意義)

此方法在更新用戶時也有效,因為我們選擇使用updateOrCreate 在此輸入圖像描述



關於這種方法的另一個注意事項是我們剛剛引入了一個n + 1查詢,因為我們在嘗試獲取gender屬性時懶得加載details關系。 要解決此問題,我們只需覆蓋indexQuery並向查詢構建器添加details

public static function indexQuery(NovaRequest $request, $query)
{
    $query->with('details');
    return parent::indexQuery($request, $query);
}

Nova 4 現在支持 hasOne 關系內聯形式

https://nova.laravel.com/docs/4.0/releases.html#inline-hasone-creation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM