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",
},
],
}
>>>