Laravel-更新数据库记录(如果已存在)-所有字段

时间:2018-08-20 12:43:31

标签: php laravel

我试图让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]

4 个答案:

答案 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");
相关问题