Я пытаюсь заставить 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]
1
oliverbj 20 Авг 2018 в 15:43

4 ответа

Лучший ответ
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() как второго массива.

Или даже установить мутатор для date_formatted, который устанавливает date.

В основном это должно произойти где-то, это просто зависит где.

1
lagbox 20 Авг 2018 в 12:59

Вы можете использовать любой из следующих способов, чтобы проверить, существуют ли записи, и выполнить запрос на обновление, если данные уже существуют.

$user = Document::where('booking_reference', '=', $request->booking_reference)->first();
if ($user === null) {
   // user doesn't exist
}

ИЛИ

if (Document::where('booking_reference', '=', $request->booking_reference)->count() > 0) {
   // user found
}

Или даже лучше

if (Document::where('booking_reference', '=', $request->booking_reference)->exists()) {
   // user found
}

И я не думаю, что вы можете обновить всю строку данных сразу. Вы должны указать, какой атрибут обновить до какого.

0
suzan 20 Авг 2018 в 12:54

Я бы имел приватную функцию для нормализации входных данных:

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;
}

И я бы использовал это так:

    $document->updateOrCreate(
        ['booking_reference' => $document->booking_reference],
        self::transformRequestInput($request->all())
    );
0
ka_lin 20 Авг 2018 в 12:58

Если вы хотите, чтобы класс или объект ассоциировали с массивом (свойства должны быть открытыми):

$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");
0
20 Авг 2018 в 13:23
51931031