Laravel Elotent에서 일대다 관계를 만드는 방법

Laravel Elotent에서 일대다 관계를 만드는 방법

2022-06-01 last update

32 minutes reading Databases PHP Frameworks PHP Laravel
이 시리즈의 필수 구성 요소로 설정된 프레젠테이션 Landing Laravel 응용 프로그램에는 링크를 저장하는 데이터베이스 테이블이 포함되어 있습니다.이 강좌에서 두 번째 테이블을 포함하기 위해 이 초기 데이터베이스 구조를 수정할 것입니다. 이 테이블을 사용하여 링크를 목록에 구성할 것입니다.
이 시리즈에서 사용할 링크와 목록의 예시에 따르면, 모든 링크는 목록의 일부분일 뿐이지만, 목록마다 여러 개의 링크가 있을 수 있다.이런 관계를 one-to-many관계라고도 부른다.
한 항목(우리는 유형 A라고 부른다)이 여러 유형 B의 항목에 연결될 수 있을 때 한 쌍의 관계가 나타나지만, 상황은 정반대이다. 유형 B의 항목은 유형 A의 한 항목에만 연결될 수 있다. 이 장면을 현재 프레젠테이션 응용 프로그램 모델로 전환한다. A는 유형list, B는 유형link이다.

링크 목록 모델 만들기


시작하려면 링크 목록을 표시하는 모델과 데이터베이스 테이블을 만들어야 합니다.그런 다음 기존 링크 모델과 테이블을 업데이트하여 두 모델 간의 관계를 포함합니다.용어List는 PHP 내부에 유지되기 때문에 이 용어를 사용하여 새 모델을 명명할 수 없습니다.당신은 이 새 모델LinkList을 개칭할 수 있습니다.
우선, 응용 프로그램 디렉터리에 있는지 확인하십시오.
  1. cd ~/landing-laravel
artisan를 사용하여 새 모델을 생성합니다.
  1. docker-compose exec app php artisan make:model LinkList
그러면 app/Model 디렉토리에 새 모델 클래스가 생성됩니다.
app/Model/LinkList.php

기존 LinkList CLI 명령 이름 변경

app/Console/Commands 디렉터리를 보면 LinkList.php 라는 클래스 파일이 있음을 알 수 있습니다.이것은 당신이 방금 만든 웅변 모델과 혼동할 수 없습니다.여기에는 데이터베이스에 있는 모든 링크를 artisan를 통해 나열하는 CLI 명령이 포함됩니다.
미래의 혼동을 피하기 위해서, 지금은 이 종류와 명령 서명을 다른 이름으로 바꾸는 좋은 시기입니다.이 예에서 클래스 이름LinkShow을 사용합니다. 이 이름은 클래스의 기능도 설명하기 때문입니다.app/Console/Commands/LinkList.php 파일의 이름을 다른 유효한 이름으로 바꾸려면 터미널에서 다음 명령을 실행합니다.
  1. mv app/Console/Commands/LinkList.php app/Console/Commands/LinkShow.php
그리고 코드 편집기에서 파일app/Console/Commands/LinkShow.php을 열고 클래스 이름을 LinkList 에서 LinkShow 로, 명령 서명을 link:list 에서 link:show 로 변경합니다. 예를 들어 아래 코드 목록에 강조 표시된 줄과 같습니다.완료되면 파일은 다음과 같습니다.
응용 프로그램/콘솔/명령/링크 표시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;
    }
}
완료되면 파일을 저장하고 닫습니다.모든 작업이 예상대로 작동하는지 확인하려면 새 이름 바꾸기 link:show artisan 명령을 실행하십시오.
  1. docker-compose exec app php artisan link:show
다음 출력을 받게 됩니다.
Output
+----+-------------------------------------------------+----------------------------------+ | id | url | description | +----+-------------------------------------------------+----------------------------------+ | 1 | https:///community | DigitalOcean Community | | 2 | https:///community/tags/laravel | Laravel Tutorias at DigitalOcean | | 3 | https:///community/tags/php | PHP Tutorials at DigitalOcean | +----+-------------------------------------------------+----------------------------------+

링크 목록 모델에 대한 마이그레이션 생성


이전 app/Model/LinkList.php 명령을 사용하여 생성된 새 artisan make:model 클래스는 새 Eloquent 클래스의 공통 코드를 포함합니다.다른 ORM과 달리 Eloquent는 데이터베이스 구조를 변경하지 않고 데이터 자체만 처리합니다.웅변의 모델은 통상적으로 정익하고 유형 속성은 모델의 표 구조에서 자동으로 추단된다.
Eloquent로만 데이터를 처리하는 방법은 LinkList 클래스에 속성을 설정할 필요가 없다는 것을 의미합니다. 왜냐하면 이 모델의 데이터베이스 테이블 구조에서 추정되기 때문입니다.
구조 데이터베이스 작업은 일반적으로 database migrations를 통해 Laravel에서 처리됩니다.마이그레이션은 개발자가 데이터베이스의 구조 변경을 프로그래밍 방식으로 정의할 수 있도록 합니다. 예를 들어 테이블을 만들고, 수정하고, 삭제할 수 있습니다.
데이터베이스에 목록표를 설정하기 위한 새로운 마이그레이션을 만들 것입니다.
Laravel에 기본적으로 포함된 artisan 명령줄 도구는 컨트롤러, 모델, 이전 등 새로운 구성 요소를 안내하는 몇 가지 보조 방법을 포함합니다.artisan를 사용하여 새 마이그레이션을 만들려면 다음을 실행하십시오.
  1. docker-compose exec app php artisan make:migration create_link_lists_table
Output
Created Migration: 2021_07_07_152554_create_link_lists_table
이 명령은 현재 날짜와 시간, 이전 이름을 기반으로 자동으로 생성된 이름을 사용하여 Laravel 응용 프로그램의 database/migrations 디렉터리에 새 파일을 생성합니다.이 파일에는 목록표를 설정하기 위해 수정할 일반 코드가 포함되어 있습니다.
코드 편집기를 사용하여 생성된 마이그레이션 파일을 엽니다.파일은 현재 다음과 같습니다.
데이터베이스/마이그레이션/2021\u07\u07\u152554\u생성\u링크\u목록\u표.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLinkListsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('link_lists', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('link_lists');
    }
}

up() 명령을 사용하여 마이그레이션을 수행하면 artisan migrate 메서드가 실행됩니다.이것이 바로 테이블 정의가 있는 위치입니다. 기본적으로 키 필드 id 와 스탬프 필드 두 개 created_atupdated_at 를 만들고 timestamps() 모드 방법으로 정의합니다.모델을 생성하고 업데이트하면 이 필드는 Eloquent에서 자동으로 채워집니다.down() 명령을 사용하여 스크롤 이동을 할 때, artisan rollback 방법을 호출합니다. 보통 코드를 실행하여 테이블을 삭제하거나 구조 변경을 복구합니다.
다음 필드를 포함하도록 up 방법을 변경합니다.
  • title: 이 목록의 제목을 나타내는 문자열
  • description: 목록 설명을 나타내는 문자열
  • slug: 제목 기반의 유일한 짧은 문자열로 일반적으로 사용자 친화적인 URL을 만드는 데 사용됩니다
  • 한 쌍의 다중 관계에서, 다방면 (이 장면에서 links표에 대응) 은 열 인용 (또는 외부 키) 을 다른 요소 (list표에 대응) 에 저장하는 측이다.이것은 이 테이블을list 테이블에 연결하는 인용 필드를 포함하기 위해 링크 테이블을 수정해야 한다는 것을 의미합니다.
    다른 한편, 목록표는 링크를 인용하는 특별한 필드가 필요하지 않습니다.
    마이그레이션 파일의 현재 컨텐트를 다음 코드로 대체합니다.
    데이터베이스/마이그레이션/2021\u07\u07\u152554\u생성\u링크\u목록\u표.php
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreateLinkListsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('link_lists', function (Blueprint $table) {
                $table->id();
                $table->timestamps();
                $table->string('title', 60);
                $table->string('slug', 60)->unique();
                $table->text('description')->nullable();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('link_lists');
        }
    }
    
    
    완료되면 파일을 저장합니다.

    링크 마이그레이션 업데이트


    다음은 코드 편집기에서 기존 링크 이동 파일을 엽니다.데모 항목에서 다음 경로에서 마이그레이션을 찾을 수 있습니다.
    2020_11_18_165241_create_links_table.php
    
    먼저 파일의 시작과 마지막 줄use 뒤에 LinkList 명령이 포함되어 있습니다. 이 명령은 use 클래스의 완전한 한정 클래스 이름을 가리킵니다.
    use Illuminate\Support\Facades\Schema;
    use App\Models\LinkList;
    ...
    
    다음은 up 방법의 표 정의에서 description 필드의 줄을 설정한 후에 다음 줄을 포함합니다.
    $table->text('description');
    $table->foreignIdFor(LinkList::class);
    
    foreignIdFor() 방법은 인용된 웅변 모델을 위해 외부 키열을 만듭니다.기본 용어를 사용하여 참조표의 키 필드에 링크되는 필드를 설정합니다.
    완료되면 전체 마이그레이션 클래스는 다음과 같습니다.
    데이터베이스/마이그레이션/2020\u11\u18\u165241\u생성\u링크\u표.php
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    use App\Models\LinkList;
    
    class CreateLinksTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('links', function (Blueprint $table) {
                $table->id();
                $table->string('url', 200);
                $table->text('description');
                $table->foreignIdFor(LinkList::class);
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('links');
        }
    }
    
    편집이 끝나면 파일을 저장합니다.다음은 데이터베이스를 지우고 migration 명령을 다시 실행하여 업데이트된 마이그레이션 파일을 사용하여 데이터베이스 구조를 다시 만듭니다.
    1. docker-compose exec app php artisan db:wipe
    2. docker-compose exec app php artisan migrate

    웅변을 배치하는 모형 관계


    현재 데이터베이스 테이블을 설치했지만 웅변적인 모델을 설정하여 그들의 관계를 정의해야 한다.
    관계식의 측면 List 모델에서 links 이라는 새로운 방법을 설정합니다.이 방법은 에이전트로 사용되며, 부모 hasMany 클래스 Illuminate\Database\Eloquent\Model 방법으로 모든 목록과 관련된 링크에 접근합니다.
    코드 편집기에서 파일app/Model/LinkList.php을 엽니다.현재 일반 코드를 다음과 같이 교체합니다.
    응용 프로그램/모델/링크 목록입니다.php
    <?php
     
    namespace App\Models;
     
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
     
    class LinkList extends Model
    {
        use HasFactory;
     
        public function links()
        {
            return $this->hasMany(Link::class);
        }
    }
     
    
    완료되면 파일을 저장합니다.
    다음은 관계식의 여러 측면을 편집하여 List 모델에 대한 참조를 포함하여 링크가 각자의 목록에 접근할 수 있도록 합니다.이것은 부belongsTo류 중의 Model 방법을 통해 완성된 것이다.이 방법은 다중 관계의 반대쪽 모서리를 정의하는 데 사용됩니다.
    코드 편집기에서 모델 열기 Link:
    app/Model/Link.php
    
    파일의 현재 내용을 다음 코드로 대체합니다.
    응용 프로그램/모델/링크.php
    <?php
     
    namespace App\Models;
     
    use Illuminate\Database\Eloquent\Model;
     
    class Link extends Model
    {
        public function link_list()
        {
            return $this->belongsTo(LinkList::class);
        }
    }
     
    
    완료되면 파일을 저장합니다.
    두 모델이 모두 업데이트된 후 데이터베이스가 완전히 설정되었지만 현재는 비어 있습니다.이 시리즈의 다음 절에서 당신은 웅변적인 모델을 사용하여 데이터베이스에 새로운 기록을 삽입하는 방법을 배울 것입니다.