728x90

ORM 

데이터베이스 시스템에 저장된 데이터를 객체로 표현하기 위한 변환하는 것을 말합니다.

그 반대로, 객체에 저장된 데이터를 데이터베이스 시스템에 저장하기 위해 데이터를 변환하는 것을 말합니다.

 

 

엘로퀸트 ORM

라라벨이 제공하는ORM 구현체의 이름입니다.

라라벨에서 데이터베이스의 데이터를 객체로 변환해 놓은 것입니다.

데이터 모델 정도로 이해하면 편할 거 같네요.

 


1. MYSQL에 authors, posts 테이블을 만듭니다.

create table authors(
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(20) NOT NULL default '',
email varchar(255) NOT NULL default '',
pwd varchar(60) NOT NULL default '',
profiles text NOT NULL,
regDate datetime NOT NULL
)ENGINE=InnoDB DEFAULT Charset=UTF8 Collate=utf8_unicode_ci;

 

create table posts(
	id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	title varchar(255) NOT NULL default '',
	contents TEXT NOT NULL,
	regDate datetime NOT NULL
)ENGINE=InnoDB DEFAULT Charset=UTF8 Collate=utf8_unicode_ci;

 

2. tinker 를 이용해서 authors, posts 테이블에 insert 하기

 

 

$ php artisan tinker

>>> DB::insert('insert into authors(name, email,pwd,profiles, regDate)values(?,?,?,?, now())', ['한치로', 'hanchiro@naver.com','password','']);

>>> DB::insert('insert into posts(title,contents,regDate)values(?,?,now())', ['hello chiro','고마워 tinker 야']);

>>> DB::insert('insert into posts(title,contents,regDate)values(?,?,now())', ['잘지내고 있나요?','잘 지내고 있나요? 전 요즈음 영어공부를 하고 있어요']);

>>> DB::insert('insert into posts(title,contents,regDate)values(?,?,now())', ['how do you today?','how do you today? those day I have been study english']);

 

3. 모델 만들기 - php artisan make:model

php artisan make:model Post

php artisan make:model Author

hanui-MacBook-Pro:NationalPension hanchiro$ php artisan make:model Post
Model created successfully.
hanui-MacBook-Pro:NationalPension hanchiro$ php artisan make:model Author
Model created successfully.
hanui-MacBook-Pro:NationalPension hanchiro$ 

 

모델을 만들게 되면 laravel프로젝트안에 Author.php 와 Post.php 라는 파일이 만들어 집니다.

 

 

 

4. DB Tablre 과 객체 연결하기

Author.php, Post.php  파일에서 각각 

protected $table = '테이블명'; 

을 추가해줍니다.

5. php artisan tinker에서 객체 실행해 보기

App\Author::get();
App\Post::get();

hanui-MacBook-Pro:NationalPension hanchiro$ php artisan tinker
Psy Shell v0.9.12 (PHP 7.1.1 — cli) by Justin Hileman
>>> 
>>> 
>>> App\Author::get();
=> Illuminate\Database\Eloquent\Collection {#2915
     all: [
       App\Author {#2916
         id: 1,
         name: "한치로",
         email: "hanchiro@naver.com",
         pwd: "password",
         profiles: "",
         regDate: "2020-02-12 17:32:05",
       },
     ],
   }
>>> App\Post::get();
=> Illuminate\Database\Eloquent\Collection {#2919
     all: [
       App\Post {#2918
         id: 1,
         title: "hello chiro",
         contents: "고마워 tinker 야",
         regDate: "2020-02-12 16:12:02",
       },
       App\Post {#2917
         id: 2,
         title: "잘지내고 있나요?",
         contents: "잘 지내고 있나요? 전 요즈음 영어공부를 하고 있어요",
         regDate: "2020-02-12 16:12:39",
       },
       App\Post {#2914
         id: 3,
         title: "how do you today?",
         contents: "how do you today? those day I have been study english",
         regDate: "2020-02-12 16:14:16",
       },
     ],
   }
>>> 

 

객체와 DB 가 제대로 연결되어 나타나네요..ㅋㅋㅋ

 


6. php artisan tinker 으로 새로운 row  레코드 만들기

>>> $author = new App\Author;

>>> $author->get();

>>> $author->save()

hanui-MacBook-Pro:NationalPension hanchiro$ php artisan tinker
Psy Shell v0.9.12 (PHP 7.1.1 — cli) by Justin Hileman
>>> $author = new App\Author;
=> App\Author {#2903}
>>> $author->get();
=> Illuminate\Database\Eloquent\Collection {#2904
     all: [
       App\Author {#2911
         id: 1,
         name: "한치로",
         email: "hanchiro@xxx.com",
         pwd: "password",
         profiles: "",
         regDate: "2020-02-12 17:32:05",
       },
     ],
   }
>>> $author->email
=> null
>>> $author->email ='hanchiro@xxx.com';
=> "hanchiro@xxx.com"
>>> $author->password='111222';
=> "111222"
>>> $author->save()

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'password' in 'field list' (SQL: insert into `authors` (`email`, `password`, ...

로 시작하면서 password 라는 필드가 없다고 에러를 내네요.

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'password' in 'field list' (SQL: insert into `authors` (`email`, `password`, `updated_at`, `created_at`) values (hanchiro@xxx.com, 111222, 2020-02-13 01:17:22, 2020-02-13 01:17:22))'

 

6-1. public $timestamps = false;

->save() 를 사용하게 되면 호출에서 예외가 발생합니다.

>>> $author = new App\Author
=> App\Author {#2909}
>>> $author->email ='hanchiro@xxx.com';
=> "hanchiro@xxx.com"
>>> $author->pwd='111222';
=> "111222"
>>> $author->save()
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (SQL: insert into `authors` (`email`, `pwd`, `updated_at`, `created_at`) values (hanchiro@xxx.com, 111222, 2020-02-13 01:24:47, 2020-02-13 01:24:47))'

 

이게 뭐냐면 엘로퀸트는 모든 테이블에 update_at와 create_at라는 datetime 필드를 자동으로 만들어 줍니다.

그래서 우리가 tinker 에서 row 정보를 만들어서 insert하고자 할대 update_at, create_at필드를 자동으로 추가해서 insert 구문을 만들어요.

그런데 실제 우리 MySQL의 Authors 테이블에는 이런 update_at, create_at 필드가 없죠.

그래서 에러가 나는 겁니다.

이를 해결 하기 위해서는 아래와 같이  public $timestamps = false; 를 model을 상속받은 Author 모델에 override 해줍니다.

// Model extends를 하면 datetime의 created_at, 와 updated_at 가 자동 생성되어진다.
   // 이를 없애기 위해서 아래의 옵션을 준다.
   // 별도의 table에 등록일자, 수정일자를 두고 있다면 아래와 같이 옵션을 주자.
   public $timestamps = false;

 

App/Author.php 파일에 public $timestamps = false;  추가

 

 

결국 메모리에 남아 있기 때문에 새로 $author = new App\Author;  부터 다시 만들었습니다.

여러번 실수를 하게 되었네요.

>>> $author = new App\Author
=> App\Author {#2903}
>>> $author->email ='hanchiro@xxx.com';
=> "hanchiro@xxx.com"
>>> $author->pwd='111222';
=> "111222"
>>> $author->save()
Illuminate/Database/QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field 'profiles' doesn't have a default value (SQL: insert into `authors` (`email`, `pwd`) values (hanchiro@xxx.com, 111222))'
>>> $author->profiles = '프로필';
=> "프로필"
>>> $author->save()
Illuminate/Database/QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field 'regDate' doesn't have a default value (SQL: insert into `authors` (`email`, `pwd`, `profiles`) values (hanchiro@xxx.com, 111222, 프로필))'
>>> $author->re;
readme.md  resources/ 
>>> $author->regDate = now();
=> Illuminate\Support\Carbon @1581557248 {#2916
     date: 2020-02-13 01:27:28.535030 UTC (+00:00),
   }
>>> $author->save()
=> true

 

>>> $author = new App\Author
=> App\Author {#2903}
>>> $author->email ='hanchiro@xxx.com';
=> "hanchiro@xxx.com"
>>> $author->pwd='111222';
=> "111222"
>>> $author->profiles = '프로필';
=> "프로필"
>>> $author->regDate = now();
=> Illuminate\Support\Carbon @1581557248 {#2916
     date: 2020-02-13 01:27:28.535030 UTC (+00:00),
   }
>>> $author->save()
=> true

 

실제 mysql  DB에 등록되었는지 확인해보세요.

이런 전 이름을 안넣었네요 ^^;;



7. App\Author::create / protected $fillable  / protected $guarded

hanui-MacBook-Pro:NationalPension hanchiro$ php artisan tinker
Psy Shell v0.9.12 (PHP 7.1.1 — cli) by Justin Hileman
>>> App\Author::create([
... 'email'=>'hanchiro@zzz.com',
... 'profiles'=>'프로필',
... 'name'=>'에버런'
... 'pwd'=>bcrypt('password'),
PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ')' or ']' on line 5
>>> App\Author::create([
'email'=>'hanchiro@zzz.com',
'profiles'=>'프로필',
'name'=>'에버런',
'pwd'=>bcrypt('password'),
... ]);
Illuminate/Database/QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field 'profiles' doesn't have a default value (SQL: insert into `authors` (`email`, `pwd`) values (hanchiro@zzz.com, $2y$10$qIfbUYenMqUPxERQCjEkTexZ2sIbCRDBCboacN1qbR89MlzTZquyO))'

 

엘로퀸트는 데이터베이스를 대량할당을 할때 필드마다 특성이 있을 수 있기 때문에 보호 장치를 2가지 뒀습니다.

1. $fillable 프로퍼티로 허용할 필드를 배열로 넣어주면 됩니다.

protected $fillable = [];
2. $guarded 프로퍼티로 금지할 필드를 배열로 넣어 주면 됩니다.
protected $guarded = [];

 

 

그리고 나서 다시 App\Author::create([]); 로 row 를 저장하니 제대로 등록이 되네요.

>>> App\Author::create([
... 'name'=>'에버런',
... 'email'=>'hanchiro@zzz.com',
... 'profiles'=>'프로필',
... 'pwd'=>bcrypt('password'), 
... 'regDate'=>now()
... ]);
=> App\Author {#2912
     email: "hanchiro@zzz.com",
     profiles: "프로필",
     pwd: "$2y$10$nFAC6nPoY6IV.gCU579.fO12d.PWFFHSr037H0J3EigJ9ispgrd4W",
     regDate: Illuminate\Support\Carbon @1581557855 {#2921
       date: 2020-02-13 01:37:35.643235 UTC (+00:00),
     },
     id: 3,
   }
>>> App\Author::get()
=> Illuminate\Database\Eloquent\Collection {#2899
     all: [
       App\Author {#2901
         id: 1,
         name: "한치로",
         email: "hanchiro@yyy.com",
         pwd: "password",
         profiles: "",
         regDate: "2020-02-12 17:32:05",
       },
       App\Author {#2900
         id: 2,
         name: "",
         email: "hanchiro@xxx.com",
         pwd: "111222",
         profiles: "프로필",
         regDate: "2020-02-13 01:27:28",
       },
       App\Author {#2902
         id: 3,
         name: "",
         email: "hanchiro@zzz.com",
         pwd: "$2y$10$nFAC6nPoY6IV.gCU579.fO12d.PWFFHSr037H0J3EigJ9ispgrd4W",
         profiles: "프로필",
         regDate: "2020-02-13 01:37:35",
       },
     ],
   }
>>> 

 

+ Recent posts