我有一个表单,它应该通过自定义选择元素(headlessUI Combobox)向orders
表提交订单详细信息。元素工作正常,但我似乎无法将选择的数据传递给数据库,在本例中为customer_id
。
下面是Create.js
页面的表单:
export default function Create(props) {
const [selected, setSelected] = useState(""),
{customers} = usePage().props
const {post, processing, data, setData} = useForm({
customer_id: "",
// other fields here
})
const customerList = customers.map((customer, index) => (
{key: customer.id, name: customer.name}
))
const submit = (e) => {
e.preventDefault()
data.customer_id = selected.key
post(route('resources.orders.store'), data)
}
<Form submit={submit}>
<SelectSearch options={customerList} name={customer_id} value={selected}
onChange={setSelected} />
{/* other form elements in here */}
<Button processing={processing} />
</Form>
}
当我console.log(data)
时,我在控制台中获得选定的值:customer_id: 4
。当我输入dd($request->all())
时,我得到数组:
^ array:5 [▼
"order_date" => "2022-05-14"
"customer_id" => 5
"service_id" => "3"
"quantity" => "1"
"discount" => "0"
]
但是当提交数据时,我得到错误SQLSTATE[HY000]: General error: 1364 Field 'customer_id' doesn't have a default value
。customer_id
是foreignId()
字段。我似乎不能创造记录。
第一个问题可能是你犯了一个错误,没有在请求中发送所需的数据。
要测试这是否为真,请使用控制器方法中的dd()函数,该方法处理存储数据的请求(如果坚持使用store()方法)。将$request变量传递给dd()函数并链接all方法以检索请求中的所有内容。
例子dd($请求→所有());
这将显示请求中的所有变量,您可以检查是否有您期望的数据。
第二件事它可能是订单模型导航到模型目录和打开订单模型类,然后检查你已经添加customer_id到可填充属性的数组。
protected $fillable = [' customer_id '];
请注意,要插入或更新的所有数据库字段必须存在于这个数组中。
我解决了问题。我必须选择自定义输入的值,并将其附加到提交方法中的data.customer_id
:
const submit = (e) => {
data.customer_id = document.querySelector('[name="customer_id[id]"]').value
post(route("resources.orders.store"), data)
}
Headless UI Combobox组件呈现存储您选择的值的隐藏输入。所以我必须将隐藏输入的值附加到data.customer_id
中。然后我还必须改变我的store()
方法:
public function store(StoreOrderRequest $request) : RedirectResponse
{
Order::create([
$request->validated(),
'customer_id' => $request->customer_id,
'order_date' => $request->order_date,
'service_id' => $request->service_id,
'discount' => $request->discount,
'user_id' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}