Laravel Eloquent에 새 데이터베이스 레코드를 삽입하는 방법

Laravel Eloquent에 새 데이터베이스 레코드를 삽입하는 방법

2022-06-01 last update

35 minutes reading Databases PHP Frameworks PHP Laravel
이 시리즈의 이전 절에서 당신은 LinkListLink 모델 간의 일대다 관계에 두 개의 모델을 설정했습니다.이 절에서, 당신은 웅변적인 모델을 사용하여 데이터베이스에 링크와 목록을 삽입하는 방법을 배울 것입니다.이 작업의 범위를 제한하려면 사용자 정의 Artisan 명령을 사용하여 명령줄에서 링크와 목록을 관리합니다. 웹 폼이 필요하지 않습니다.
ORM 시스템을 사용하는 가장 큰 장점 중 하나는 데이터베이스 테이블의 줄을 코드 라이브러리의 대상으로 조작할 수 있다는 것이다.다른 ORM과 마찬가지로 Elounce에 대해 대상 자체는 데이터베이스에 영구화하는 방법을 제공하여 SQL 문장을 작성하고 테이블의 데이터를 수동으로 관리하는 작업을 줄였다.
Laravel Eloquent에서 한 쌍의 다중 관계를 처리할 때 관련 모델을 저장할 수 있는 여러 가지 옵션이 있습니다.대부분의 경우 관계 측면을 나타내는 모델을 먼저 설정하고 이 프레젠테이션에서 LinkList 모델을 데이터베이스에 저장해야 합니다.이 작업을 완료하면 관계식의 다방면 Link 모델을 설정할 때 이 모델을 참조할 수 있습니다 (저장하면 데이터베이스 기록을 나타냅니다).이것은 링크를 만들기 전에 하나 이상의 목록이 있어야 한다는 것을 의미합니다.
그러나 목록을 삽입하는 새 명령을 만들기 전에 목록 기능을 지원하기 위해 기존 link:new 명령을 업데이트해야 합니다.
코드 편집기에서 다음 파일을 엽니다.
app/Console/Commands/LinkNew.php
다음 코드가 표시됩니다.
응용 프로그램/콘솔/명령/링크 새로 만들기.php
<?php

namespace App\Console\Commands;

use App\Models\Link;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class LinkNew extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'link:new';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a New Link';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $url = $this->ask('Link URL:');

        if (!filter_var($url, FILTER_VALIDATE_URL)) {
            $this->error("Invalid URL. Exiting...");
            return 1;
        }

        $description = $this->ask('Link Description:');

        $this->info("New Link:");
        $this->info($url . ' - ' . $description);

        if ($this->confirm('Is this information correct?')) {
            $link = new Link();
            $link->url = $url;
            $link->description = $description;
            $link->save();

            $this->info("Saved.");
        }

        return 0;
    }
}

handle() 방법은 그 과정을 명령하는 곳이다.이것이 바로 그것이 한 일이다.
  • ask() 클래스를 통해 제공되는 Illuminate\Console\Command 방법은 명령줄의 사용자로부터 입력을 가져오는 방법입니다.그러면 링크를 입력하라는 메시지가 표시되고 유효한 URL인지 확인합니다.
  • 그리고 스크립트는 선택할 수 있는 설명을 요구합니다.
  • URL과 설명된 값을 얻으면 스크립트는 confirm() 방법으로 부모 Illuminate\Console\Command 를 통해 확인할 수 있음을 알려 줍니다.
  • 사용 y 또는 yes 제출 확인을 할 때 스크립트는 새로운 링크 대상을 설정하고 save() 방법으로 데이터베이스에 저장합니다. 이 방법은 모델의 부류Illuminate\Database\Eloquent\Model를 통해 얻을 수 있습니다.
  • 스크립트는 info 출력 방법을 사용하여 데이터베이스에 링크가 저장되었음을 알리는 메시지를 출력합니다.
  • 반환 값에 대한 참고 사항: bash 에서 실행되는 명령행 응용 프로그램의 상하문에서 0 반환 값이 아닌 값은 응용 프로그램의 오류가 종료되었음을 나타내는 데 사용되고, 0 은 성공적으로 종료되었음을 나타냅니다.
    현재 link:new 명령을 실행하면 데이터베이스가 모든 링크를 목록에 연결하기를 원하기 때문에 완료되기 전에 중단됩니다.사용자가 링크를 포함해야 할 목록을 선택하도록 해야 합니다. 사용자가 목록을 제공하지 않으면 기본 목록을 사용합니다.
    다음 코드는 사용자가 기본 목록을 사용하도록 목록을 지정하거나 비워 두도록 요구합니다.그리고 목록이 존재하지 않으면 목록을 찾거나 지정한slug를 사용하여 새 목록을 만듭니다.사용자가 제공한 목록을 검색하기 위해서, 이 코드는 firstWhere 방법을 사용하여slug 필드에 따라 목록을 찾습니다.마지막으로 links() 객체에서 액세스할 수 있는 LinkList 관계를 사용하여 새 링크를 저장합니다.LinkNew 명령 클래스의 현재 컨텐트를 다음으로 바꿉니다.
    응용 프로그램/콘솔/명령/링크 새로 만들기.php
    <?php
    
    namespace App\Console\Commands;
    
    use App\Models\Link;
    use App\Models\LinkList;
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\DB;
    
    class LinkNew extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'link:new';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Create a New Link';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $url = $this->ask('Link URL');
    
            if (!filter_var($url, FILTER_VALIDATE_URL)) {
                $this->error("Invalid URL. Exiting...");
                return 1;
            }
    
            $description = $this->ask('Link Description');
            $list_name = $this->ask('Link List (leave blank to use default)') ?? "default";
    
            $this->info("New Link:");
            $this->info($url . ' - ' . $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 = new Link();
                $link->url = $url;
                $link->description = $description;
                $list->links()->save($link);
    
                $this->info("Saved.");
            }
    
            return 0;
        }
    }
    
    
    완료되면 파일을 저장하고 닫습니다.그런 다음 다음 다음 명령을 실행합니다.
    1. docker-compose exec app php artisan link:new
    이 링크를 기본 목록에 저장하지 않으려면 URL, 설명 및 목록 이름을 묻는 메시지가 표시됩니다.
    새 링크를 저장한 후 link:show 명령을 실행하면 결과에 추가된 새 링크를 볼 수 있습니다.그러나 목록에 대한 정보는 출력에 없습니다.이 정보를 표시하는 열을 포함하려면 LinkShow 명령을 업데이트해야 합니다.
    코드 편집기에서 파일 열기 app/Console/Commands/LinkShow.php:
    app/Console/Commands/LinkShow.php
    
    현재의 과정은 반드시 이렇다.
    응용 프로그램/콘솔/명령/링크 표시php
    <?php
     
    namespace App\Console\Commands;
     
    use App\Models\Link;
    use Illuminate\Console\Command;
     
    class LinkShow extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'link:show';
     
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'List links saved in the database';
     
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
     
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $headers = [ 'id', 'url', 'description' ];
            $links = Link::all(['id', 'url', 'description'])->toArray();
            $this->table($headers, $links);
     
            return 0;
        }
    }
    
    현재 handle() 방법이 일정한 필드를 가져오고 결과를 그룹으로 변환하는 것을 볼 수 있습니다.기본적으로 결과는 Eloquent에서 Eloquent로 집합되기 때문에 이 함수는 table() 방법에서 이 데이터를 사용할 수 있도록 수조로 변환됩니다.문제는 수조 변환을 할 때 클래스 모델(LinkLinkList 간의 관계를 잃어버려 링크가 연결된 목록에 접근하기 어렵다는 것이다.
    데이터베이스에서 관련 대상을 포함하여 전체 Link 대상을 가져올 수 있도록 이 코드를 변경해야 합니다.table() 방법과 함께 사용할 수 있는 그룹을 만들려면 Link::all() 되돌아오는 결과 집합을 반복할 수 있습니다.
    파일의 현재 내용을 다음 코드로 대체합니다.
    응용 프로그램/콘솔/명령/링크 표시php
    <?php
    
    namespace App\Console\Commands;
    
    use App\Models\Link;
    use Illuminate\Console\Command;
    
    class LinkShow extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'link:show';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'List links saved in the database';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $headers = [ 'id', 'url', 'list', 'description' ];
            $links = Link::all();
    
            $table_rows = [];
            foreach ($links as $link) {
                $table_rows[] = [ $link->id, $link->url, $link->link_list->slug, $link->description ];
            }
    
            $this->table($headers, $table_rows);
    
            return 0;
        }
    }
    
    
    현재 app/Console/Commands/LinkShow.php 메서드를 실행하면 목록 slug가 다른 열로 표시됩니다.
    Output
    +----+-----------------------------------------------------------------------------------------+-----------+--------------------------------------+ | id | url | list | description | +----+-----------------------------------------------------------------------------------------+-----------+--------------------------------------+ | 1 | https:// | default | DigitalOcean Website | | 2 | https:///community/tutorials | tutorials | DO Tutorials | | 3 | https://www./community/tutorials/initial-server-setup-with-ubuntu-20-04 | tutorials | Initial server setup on ubuntu 20.04 | +----+-----------------------------------------------------------------------------------------+-----------+--------------------------------------+
    이 시리즈 강좌의 뒷부분에서 앞부분과 메인 라인 코드를 업데이트하여 목록에 따라 구성된 링크를 표시합니다.이제 명령줄을 사용하여 데이터베이스와 모델에 대한 변경 사항을 추가, 이전, 검증합니다.
    이 시리즈의 다음 강좌는 웅변모델을 사용하여 데이터베이스에 신기록을 삽입하는 또 다른 방법을 보여 줄 것이다. 이번에는 사용database seeders을 통해.