programing

Laravel Archent가 변경된 경우에만 업데이트

newsource 2022. 11. 7. 22:37

Laravel Archent가 변경된 경우에만 업데이트

그 레코드에 변경이 가해진 경우, 유창한 모델을 사용하여 라라벨에서 레코드를 갱신할 수 있는 방법이 있습니까?변경 내용을 저장하기 위해 버튼을 누르기만 하면 사용자가 정당한 이유 없이 데이터베이스를 계속 요청하는 것을 원하지 않습니다.나는 가지고 있다javascript페이지의 변경 유무에 따라 저장 버튼을 활성화/비활성화하는 기능인데, 서버측에서도 이러한 기능을 할 수 있는지 알고 싶습니다.레코드가 변경되었는지 확인하는 것만으로 (프레임워크의 내부 기능에 어필하지 않고) 혼자 할 수 있다는 것은 알고 있습니다만, 그 전에 Laravel의 웅변 모델이 이미 그것을 처리하고 있는지 알고 싶기 때문에 바퀴를 다시 발명할 필요는 없습니다.

레코드를 갱신하는 방법은 다음과 같습니다.

$product = Product::find($data["id"]);
$product->title = $data["title"];
$product->description = $data["description"];
$product->price = $data["price"];
//etc (string values were previously sanitized for xss attacks)
$product->save();

벌써 하고 있잖아!

save()모델 내의 무언가가 변경되었는지 확인합니다.그렇지 않으면 DB 쿼리를 실행하지 않습니다.

코드와 관련된 부분은 다음과 같습니다.Illuminate\Database\Eloquent\Model@performUpdate:

protected function performUpdate(Builder $query, array $options = [])
{
    $dirty = $this->getDirty();

    if (count($dirty) > 0)
    {
        // runs update query
    }

    return true;
}

getDirty()method는 단순히 현재 속성을 에 저장된 복사본과 비교합니다.original모델 생성 시.이것은, 로 행해집니다.syncOriginal()방법:

public function __construct(array $attributes = array())
{
    $this->bootIfNotBooted();

    $this->syncOriginal();

    $this->fill($attributes);
}

public function syncOriginal()
{
    $this->original = $this->attributes;

    return $this;
}

모델이 더러우신지 확인하고 싶으시면 전화주세요.isDirty():

if($product->isDirty()){
    // changes have been made
}

또는 특정 속성을 체크하는 경우:

if($product->isDirty('price')){
    // price has changed
}

사용할 수 있습니다.$product->getChanges()달변 모델로 계속 하고 있어요.여기서 문서 확인

이 메서드를 추가하고 싶습니다만, 편집 폼을 사용하고 있는 경우는, 이 코드를 사용해 변경 내용을 보존할 수 있습니다.update(Request $request, $id)기능:

$post = Post::find($id);    
$post->fill($request->input())->save();

입력에 동일한 열 이름을 지정해야 한다는 점에 유의하십시오.fill()함수가 모든 작업을 수행합니다. : )

언급URL : https://stackoverflow.com/questions/28866500/laravel-eloquent-update-just-if-changes-have-been-made