簡體   English   中英

PHP Laravel,替換方法 updateOrCreate

[英]PHP Laravel, Replacement for method updateOrCreate

以下問題是更大項目的一部分。 作為一名大三學生,我得到了替換 Laravel 用於創建令牌的方法 updaterOrCreate 的任務。 使用的方法是:

public function creaOUp(
    string $token,
    string $carId,
    int $exDate,
    string $log,
    int $driverId
): DriverToken {
    $token = DriverToken::onWriteConnection()->updateOrCreate([
        'car_id' => $carId,
        'driver_id' => $driverId
    ], [
        'token' => $token,
        'ex_date' => $exDate,
        'login' => $log,
    ]);

    return $token;
}

在項目中調用方法是這樣的:

private $driverTokenRepository;
//....
        return $this->driverTokenRepository->creaOUp(
            (string)$jwt,
            $deviceData->uid,
            $jwt->getClaim('exp'),
            $claims->getLogin(),
            $claims->getDriverParentId()
  //....

我已經替換了方法 updateOrCreate 的方法:

 public function creaOUp(
    string $token,
    string $carId,
    int $exDate,
    string $log,
    int $driverId
): DriverToken {
    $token = DriverToken::query()
    ->where([
        'car_id' => $carId,
        'driver_id' => $driverId,
    ])
    ->first();
    
    if ($token !== null) {
        $token->update([
                 'token' => $token,
                 'car_id' => $carId,
                 'ex_date' => $exDate,
                 'login' => $log, 
                 
             ]);
    } else {
        $token = DriverToken::create([
            'token' => $token,
            'car_id' => $carId,
            'ex_date' => $exDate,
            'login' => $log,
            'driver_id' => $driverId,
        ]);
    }

    return $token;
}

我確信它會起作用,但是我遇到了錯誤:

"SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'token' cannot be null (SQL: insert into `driver_tokens` (`token`, `car_id`, `ex_date`, `login`, `driver_id`) values (?, cba567D1, 2425452525, HUGO_315, 3))"

我做錯了什么? 為什么令牌為空? 使用原始 Laravel 的 updateOrCreate 就可以了,也許我真的不明白這個方法?

解決了:

首先,感謝桑迪的幫助,這是我在 StackOverflow 上的第一篇文章:D

問題出在參數 $token 上。 它被用作字面上的標記和查詢。 我剛剛將查詢中的 $token 更改為:

    public function creaOUp(
    string $token,
    string $carId,
    int $exDate,
    string $log,
    int $driverId
): DriverToken {
    $quer = DriverToken::query()
    ->where([
        'car_id' => $carId,
        'driver_id' => $driverId,
    ])
    ->first();
    
    if ($quer !== null) {
        $quer->update([
                 'token' => $token,
                 'car_id' => $carId,
                 'ex_date' => $exDate,
                 'login' => $log, 
                 
             ]);
    } else {
        $quer = DriverToken::create([
            'token' => $token,
            'car_id' => $carId,
            'ex_date' => $exDate,
            'login' => $log,
            'driver_id' => $driverId,
        ]);
    }

    return $quer;
}

它解決了這個問題。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM