我想存盤帶有標題、年份和現有作者的書籍。作者保存在與書籍表具有一對多關系的表作者中。要創建一本書,我有一個帶有兩個文本輸入和一個選擇的來源。選擇從資料庫中填充。現在我想存盤它們并立即附上作者。
我無法在路線中傳遞作者,因為它是動態選擇輸入。有沒有可能像下面的電話那樣做?
路線:
Route::post('/store', [BookController::class, 'store'])->name('book.store');
控制器:
public function store(Request $request,Author $author_id)
{
$validated = $request->validate([
'title' => 'required',
'year' => 'required',
'book_id' => 'required'
]);
Book::create($request->all());
return redirect()->route('book.index');
}
uj5u.com熱心網友回復:
如果我理解正確,您想為您使用路由模型系結Author,但該值是<select>在表單上選擇的。
這是一個解決方案;如果不用路由模型系結就簡單多了,看下面第二種方案。
路由模型系結方案
對于路由模型系結,您需要這樣的路由:
Route::post('/store/{author}', [BookController::class, 'store'])->name('book.store');
因此,您需要知道作者 ID 才能生成表單actionURI——您不能在頁面加載時執行此操作,因為用戶尚未選擇作者。解決這個問題的一種方法是使用 Javascript——每次更改時select,找到選定的作者,并更新表單的action.
這是一個可以執行此操作的有效 HTML/JS 代碼段,但您需要在瀏覽器的開發人員工具中查看表單以查看操作的變化。
let form = document.querySelector('form');
let defaultAction = form.dataset.action;
let select = document.querySelector('select');
let debugDisplay = document.querySelector('p');
let action;
select.addEventListener('change', () => {
action = defaultAction select.value;
form.setAttribute('action', action);
debugDisplay.innerHTML = 'Form action is now "' action '"';
});
<form action="" method="post" data-action="/store/">
<select name="author_id">
<option>Choose an author</option>
<option value="1">William Gibson</option>
<option value="2">Iain M Banks</option>
</select>
</form>
<p></p>
現在,假設您使用上面顯示的路由、表單和 Javascript,并且設定了Author<->關系,您的控制器可以執行以下操作:Book
public function store (Request $request, Author $author) {
// Your validation ...
// Create the book for this author
$book = $author->books()->create($request->all());
return redirect()->route('book.index');
}
請注意,您可能應該包含某種前端 Javascript 驗證,以檢查是否選擇了作者,否則action未設定并且表單將發布到當前 URL,這可能會導致 404。
更簡單的解決方案
如果你可以在沒有路由模型系結的情況下生活,這就非常簡單了。您現有的路線很好:
Route::post('/store', [BookController::class, 'store'])->name('book.store');
您的表單應包含author_id, 與上例完全相同。
并且控制器只需要 1 行額外的代碼來找到選定的作者:
public function store (Request $request) {
// Your validation ...
// Find the author
$author = Author::find($request->author_id);
// Create the book for this author
$book = $author->books()->create($request->all());
return redirect()->route('book.index');
}
uj5u.com熱心網友回復:
必須發送第二個引數才能從作者表中獲取模型。除非您修改路由以接受引數并在提交時將 JS 偵聽器添加到表單,使用選定的作者更改操作 URL,據我所知這是不可能的。
既然你沒有對 Author 模型做任何事情,也許你可以為 author_id => "required,exists:authors" 添加驗證?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535702.html
標籤:拉维形式模型要求店铺
上一篇:Wordpress:是否可以在同一頁面上使用$index和$value作為輸入欄位的2個表單?
下一篇:如何退出具有通道無限回圈的功能
