Laravel Eloquent에서 데이터베이스 레코드를 업데이트하는 방법

Laravel Eloquent에서 데이터베이스 레코드를 업데이트하는 방법

2022-05-31 last update

30 minutes reading Databases PHP Frameworks PHP Laravel
이 시리즈의 이전 섹션에서는 새 목록 기능을 지원하기 위해 기존 Artisan 명령을 업데이트했습니다.링크를 삽입하고 삭제하는 명령이 있지만 프레젠테이션 프로그램에는 현재 기존 링크를 편집하는 명령이 없습니다.예를 들어 이것은 목록 사이에서 링크를 이동하거나 링크 설명을 업데이트하는 데 매우 유용하다.
이 설명서에서 데이터베이스에 있는 기존 링크를 업데이트하기 위한 새 Artisan 명령을 만듭니다.
터미널에서 먼저 프로젝트의 루트 디렉토리에 있는지 확인한 다음 다음 다음 명령을 실행하여 새 Artisan 명령을 부트합니다.
  1. docker-compose exec app php artisan make:command LinkUpdate
그러면 LinkUpdate.php 에 있는 새 app/Console/Commands 파일이 생성됩니다.선택한 코드 편집기에서 파일을 열려면 다음과 같이 하십시오.
app/Console/Commands/LinkUpdate.php
이 파일에는 새 Artisan 명령의 템플릿 코드가 들어 있습니다.유일한 id를 제공하는 상황에서 링크를 편집할 수 있도록 업데이트할 것입니다. handle() 방법은 다음과 같습니다.
  • 사용자가 제공한 id를 가져오고 데이터베이스에 일치하는 id가 있는지 확인합니다.
  • 유효한 링크를 찾을 수 없으면 오류 메시지가 표시되고 종료됩니다.
  • 유효한 링크를 찾으면 링크 설명과 링크 목록의 업데이트 값을 알려 줍니다.
  • 변경 사항을 확인하십시오.
  • 확인 후 데이터베이스에 있는 항목을 업데이트합니다.
  • 먼저 파일 맨 위에 정의된 쌍use을 포함하여 나중에 참조할 수 있도록 합니다LinkLinkList 클래스:
    응용 프로그램/콘솔/명령/링크 업데이트.php
    <?php
     
    namespace App\Console\Commands;
     
    use App\Models\Link;
    use App\Models\LinkList;
    use Illuminate\Console\Command;
     
    ...
    
    링크 id를 가져오려면 newlink:update 명령에 사용자가 실행할 때 이 인자를 제공할 수 있도록 강제 인자를 설정해야 합니다.파일 상단에서 명령 서명 정의를 찾아 강조 표시된 행으로 대체합니다.
    응용 프로그램/콘솔/명령/링크 업데이트.php
    ...
     
    class LinkUpdate extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'link:update {link_id}';
    ...
    
    파일을 저장하고 다른 매개 변수를 사용하지 않은 상태에서 명령을 실행하려고 하면 오류가 발생합니다.
    1. docker-compose exec app php artisan link:update
    Output
    Not enough arguments (missing: "link_id").
    handle() 방법에서 사용자가 제공한 링크 id를 가져와 데이터베이스에서 찾아야 합니다.이것은 아버지argument()류가 제공한 Command 방법을 통해 완성할 수 있다.그리고 find() 웅변 방법으로 데이터베이스에 이 id가 있는 링크를 조회할 수 있습니다. find() 방법이 되돌아오면 null 이 id가 있는 링크를 찾지 못했기 때문에 프로그램이 오류로 종료되어야 합니다.
    응용 프로그램/콘솔/명령/링크 업데이트.php
    ...
       /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $link_id = $this->argument('link_id');
            $link = Link::find($link_id);
     
            if ($link === null) {
                $this->error("Invalid or non-existent link ID.");
                return 1;
            }
            
            // obtain updated information from user
        }
    ...
    
    유효한 링크를 찾으면 업데이트된 링크 정보를 알려야 합니다. ask 메서드를 사용하여 다음 예제에서 강조 표시할 수 있습니다.
    응용 프로그램/콘솔/명령/링크 업데이트.php: 함수 핸들 ()
    ...
            if ($link === null) {
                $this->error("Invalid or non-existent link ID.");
                return 1;
            }
     
            $link->description = $this->ask('Link Description (ENTER to keep current)') ?? $link->description;
            $list_name = $this->ask('Link List (ENTER to keep current)') ?? $link->link_list->title;
    ...
    
    이 코드는 사용자가 새 값을 제공하지 않도록 현재 값을 기본값으로 유지하면서 ENTER 키를 눌러 프롬프트를 건너뛰도록 설명과 목록을 업데이트하라는 메시지를 표시합니다.
    이 모든 정보를 얻으면 계속 업데이트할 수 있습니다.데이터베이스 업데이트를 실행하기 전에 confirm() 방법을 사용하여 사용자가 변경을 확인하는 것이 가장 좋다.이 코드의 모양은 다음과 같습니다.
    응용 프로그램/콘솔/명령/링크 업데이트.php: 함수 핸들 ()
    ...
            $link->description = $this->ask('Link Description (ENTER to keep current)') ?? $link->description;
            $list_name = $this->ask('Link List (ENTER to keep current)') ?? $link->link_list->title;
     
            $this->info("Description: $link->description");
            $this->info("Listed in: " . $list_name);
     
            if ($this->confirm('Is this information correct?')) {
                //code that updates the link
            }
    ...
    
    if 블록에서 먼저 요청한 목록이 있는지 확인해야 합니다. 그렇지 않으면 제공된 이름으로 새 목록을 만들어야 합니다.그런 다음 associate() 메서드를 사용하여 링크와 상위 목록 간의 관계를 업데이트합니다.마지막으로 save() 메서드는 데이터베이스에 대한 변경 사항을 유지합니다.
    응용 프로그램/콘솔/명령/링크 업데이트.php: 함수 핸들 ()
    ...
            if ($this->confirm('Is this information correct?')) {
                $list = LinkList::firstWhere('slug', $list_name);
                if (!$list) {
                    $list = new LinkList();
                    $list->title = $list_name;
                    $list->slug = $list_name;
                    $list->save();
                }
                $link->link_list()->associate($list)->save();
                $this->info("Updated.");
            }
    ...
    
    이것은 완전한 LinkUpdate.php 파일입니다. 참고:
    응용 프로그램/콘솔/명령/링크 업데이트.php
    <?php
     
    namespace App\Console\Commands;
     
    use App\Models\Link;
    use App\Models\LinkList;
    use Illuminate\Console\Command;
     
    class LinkUpdate extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'link:update {link_id}';
     
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Update a link in the database';
     
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
     
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $link_id = $this->argument('link_id');
            $link = Link::find($link_id);
     
            if ($link === null) {
                $this->error("Invalid or non-existent link ID.");
                return 1;
            }
     
            $link->description = $this->ask('Link Description (ENTER to keep current)') ?? $link->description;
            $list_name = $this->ask('Link List (ENTER to keep current)') ?? $link->link_list->title;
     
            $this->info("Description: $link->description");
            $this->info("Listed in: " . $list_name);
     
            if ($this->confirm('Is this information correct?')) {
                $list = LinkList::firstWhere('slug', $list_name);
                if (!$list) {
                    $list = new LinkList();
                    $list->title = $list_name;
                    $list->slug = $list_name;
                    $list->save();
                }
                $link->link_list()->associate($list)->save();
                $this->info("Updated.");
            }
     
            return 0;
        }
    }
    
    참고: Artisan 명령에 대한 자세한 내용은 How To Create Artisan Commands to Manage Database Records in Laravel 의 지침을 참조하십시오. 이것은 저희가 소개한 Laravel 시리즈의 일부입니다.
    완료되면 파일을 저장합니다.그런 다음 link:show 명령을 사용하여 모든 링크와 각 ID를 가져옵니다.
    1. docker-compose exec app php artisan link:show
    Output
    +----+-------------------------------------------------+--------------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+--------------+----------------------------------+ | 1 | https:///community | default | DO Community | | 2 | https:///community/tags/laravel | default | Laravel Tutorias at DigitalOcean | | 3 | https:///community/tags/php | default | PHP Tutorials at DigitalOcean | | 4 | https://twitter.com/ | social | Twitter | | 5 | https://dev.to/ | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+--------------+----------------------------------+
    그런 다음 편집할 항목을 선택합니다.예를 들어, Digital Ocean 웹 사이트의 링크를 가리키는 목록을 만들 수 있습니다. (이전 예시 출력에서 ID가 1, 2, 3인 항목에 해당합니다.)
    ID가 1인 링크를 업데이트하려면 다음을 실행하십시오.
    1. docker-compose exec app php artisan link:update 1
    Output
    Link Description (ENTER to keep current): > DO Community Link List (ENTER to keep current): > Description: DO Community Listed in: Is this information correct? (yes/no) [no]: > y Updated.
    그런 다음 link:show 명령을 다시 실행하여 업데이트된 정보를 확인합니다.
    Output
    +----+-------------------------------------------------+--------------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+--------------+----------------------------------+ | 1 | https:///community | | DO Community | | 2 | https:///community/tags/laravel | | Laravel Tutorias at DigitalOcean | | 3 | https:///community/tags/php | | PHP Tutorials at DigitalOcean | | 4 | https://twitter.com/ | social | Twitter | | 5 | https://dev.to/ | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+--------------+----------------------------------+
    이 설명서에서는 Laravel Eloquent를 사용하여 데이터베이스 레코드를 업데이트하는 방법을 학습했습니다.사용자가 데이터베이스에 있는 기존 링크를 편집할 수 있도록 새 명령을 포함하도록 프레젠테이션 프로그램을 업그레이드했습니다.
    이 시리즈의 다음 부분이자 마지막 부분에서 링크 목록을 삭제하는 새 명령을 만들 것입니다.