데이터베이스에서 만든 뷰를 Laravel로 가져오기

4636 단어 라라벨

소개



MySQL로 만든 뷰를 Laravel로 가져오는 방법에 대한 메모 감각으로.
  • MySQL로 작성한 뷰의 모델을 작성한다.
  • ORM (Eloquent)을 사용하여 레코드를 얻습니다.

  • 개발 환경



    ・Laravel 7.30.4
    · MySQL 5.7.32

    프로젝트 만들기



    텍토에 프로젝트를 만듭니다.
    composer create-project --prefer-dist "laravel/laravel=7.*.*" hoge_app
    

    .env 파일 변경



    DB를 설정합니다.
    사용하는 DB명은 텍토로 만들어 주세요.

    .env
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=world
    DB_USERNAME=##########
    DB_PASSWORD=##########
    


    .env 파일 설정이 끝나면 프로젝트 디렉토리로 이동하여 다음 명령을 실행하십시오.
    php artisan config:cache
    

    이것을 실행하지 않으면 변경 내용이 반영되지 않으므로 반드시 하도록…

    소통 확인(마이그레이션 실행)



    아래의 명령을 실행하여 .env로 지정한 DB에 테이블을 작성할 수 있으면 소통 확인은 OK입니다.
    php artisan migrate
    

    실패하면 사용자 이름이나 비밀번호가 잘못되었을 가능성이 있으므로 다시 확인을…

    모델 만들기



    나는 "v_countryinformation"이라는 뷰를 만들었다.
    덧붙여서 레코드는 이런 느낌입니다.


    뷰 작성이 끝나면 모델링을 수행하는 명령을 실행합니다.
    아래의 명령을 실행한 후, App 디렉토리에 「모델명.php」라고 하는 파일(이번은 CountryInfo.php)이 작성됩니다.
    php artisan make:model CountryInfo[=モデル名]
    

    생성된 모델 클래스에 다음 속성을 추가하고 참조할 뷰를 지정합니다.

    CountryInfo.php
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class CountryInfo extends Model
    {
        /**
         * 
         * モデルと関連するビューを指定する
         */
        protected $table = 'v_countryinformation';
    
    }
    

    비고: 테이블명과 모델명의 규칙성
    모델에 사용할 테이블을 $table로 지정하지 않으면 자동으로 클래스 이름의 복수형 테이블을 참조합니다.
    예를 들어, Person 모델이 참조하는 테이블은 Person의 다중 시스템인 People 테이블입니다.

    Eloquent를 사용하여 뷰 레코드 얻기



    이번에는 tinker로 취득 할 수 있는지 확인하기 때문에 아래의 명령에서 tinker를 시작합니다.
    php artisan tinker
    

    시작할 수 있으면 Eloquent를 사용하여 레코드를 검색합니다.
    App\CountryInfo::where('Language', 'English')->first();
    => App\CountryInfo {#3351
         Code: "ABW",
         CountryName: "Aruba",
         CountryPopulation: 103000,
         Code2: "AW",
         Capital: 129,
         CityName: "Oranjestad",
         CityPopulation: 29034,
         Language: "English",
         IsOfficial: "F",
         Continent: "North America",
         Region: "Caribbean",
       }
    

    잘 얻을 수 있었던 것 같습니다.

    위의 결과는 다음 쿼리의 결과와 동일합니다.
    SELECT * FROM v_countryinformation WHERE Language = 'English' LIMIT 1

    또, 당연합니다만 쿼리 빌더를 사용해도 취득할 수 있습니다.
    DB::table('v_countryinformation')->where('Language', 'English')->first();
    => {#3366
         +"Code": "ABW",
         +"CountryName": "Aruba",
         +"CountryPopulation": 103000,
         +"Code2": "AW",
         +"Capital": 129,
         +"CityName": "Oranjestad",
         +"CityPopulation": 29034,
         +"Language": "English",
         +"IsOfficial": "F",
         +"Continent": "North America",
         +"Region": "Caribbean",
       }
    

    요약



    엉망이라고 썼습니다만, 요컨대 모델 클래스의 $table 프로퍼티에 뷰를 지정하면 된다고 하는 것입니다.

    쿼리 빌더에는 테이블을 조인하는 join 메소드도 있으므로, 일부러 뷰를 만들 필요도 없는 생각이 듭니다만, 개인적으로는 프로그램내에서 테이블 조인시키는 것보다는 뷰내에서 그것을 실시해, 그 뷰에 대해서 필터링하는 것이 적은 코드의 양으로 데이터를 얻을 수 있기 때문에 좋다고 생각했습니다.

    참고

    좋은 웹페이지 즐겨찾기