我试图让Laravel更新数据库记录(如果已经存在)。这是我的桌子:
id | booking_reference | description | date
------------------------------------------------------
PRI KEY | UNIQUE | MEDIUM TEXT | DATE
AUTO INC | |
我的模型如下:
Document.php
:
class Document extends Model
{
protected $fillable = [
'booking_reference', 'description', 'date'
];
}
我的控制器看起来像这样-请注意,正在调用的是webhook()
。
DocumentController.php
:
class DocparserController extends Controller
{
//This is the function to capture the webhook
public function webhook(Request $request)
{
$document = new Document();
$document->fill($request->all());
//Grab the date_formatted field from our request.
$document->date = $request->input('date_formatted');
$document->updateOrCreate(
['booking_reference' => $document->booking_reference],
//How can I do so it updates all fields?
);
return response()->json("OK");
}
}
所以我的问题是,我无法弄清楚如何更新已经存在booking_reference
的整个行。
我想更新所有字段(描述,日期),无需,而必须输入所有类似的内容:
['booking_reference' => $document->booking_reference],
['description' => $document->comments, 'date' => $document->date]
答案 0 :(得分:1)
Document::updateOrCreate(
['booking_reference' => $request->input('booking_reference')],
$request->all() + ['date' => $request->input('date_formatted')]
);
如果您想在调用之前调整请求输入,则可以进行映射并将其精简。
$request->merge(['date' => $request->input('date_formatted')]);
// now $request->all() has `date`
...updateOrcreate(
[...],
$request->all(),
)
该特定字段必须在某个时刻进行映射...如果您真的很想要,您实际上可以让中间件来执行此映射,这会将它简化为$request->all()
作为第二个数组。< / p>
或者甚至为date_formatted
设置了date
的增幅器。
这基本上必须在某个地方发生,这取决于哪里。
答案 1 :(得分:0)
您可以使用以下任一方法来检查记录是否存在,如果数据已经存在,请运行更新查询。
$user = Document::where('booking_reference', '=', $request->booking_reference)->first();
if ($user === null) {
// user doesn't exist
}
OR
if (Document::where('booking_reference', '=', $request->booking_reference)->count() > 0) {
// user found
}
甚至更好
if (Document::where('booking_reference', '=', $request->booking_reference)->exists()) {
// user found
}
我不认为您可以一次更新整行数据。您必须指出要更新到哪个属性。
答案 2 :(得分:0)
我将具有私有功能来规范输入数据:
block_scan()
我会这样使用它:
private static function transformRequestInput($requestArray)
{
$map = ['date_formatted'=>'date'];
foreach($map as $key=>$newKey){
if(isset($requestArray[$key])) {
$requestArray[$newKey] = $requestArray[$key];
unset($requestArray[$key]);
}
}
return $requestArray;
}
答案 3 :(得分:0)
如果要让类或对象关联数组(属性必须是公共的):
$updateArr = (array) $document;
$document->updateOrCreate($updateArr);
但是,您使用的是受保护的属性($ fillable),因此您必须:
$document = new Document();
$document->fill($request->all());
//Grab the date_formatted field from our request.
$document->date = $request->input('date_formatted');
$reflection = new ReflectionClass($document);
$property = $reflection->getProperty('fillable');
$property->setAccessible(true);
$updateArr = (array) $property->getValue($document);
$property->setAccessible(false);
$document->updateOrCreate($updateArr);
return response()->json("OK");