관례(Convention)
테이블과 모델명
전 절에서 artisan make:model 로 생성한 할일에 대한 모델 파일인 app/Task.php 를 다시 열어 봅시다.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
}
모델과 일치하는 테이블명이 기술되어 있지 않지만 모델 클래스는 테이블 이름을 StudlyCase 형식의 문자로 만들고 단수형으로 사용하는 관례가 있습니다.
모델 | 테이블 |
---|---|
Task | tasks |
PasswordReset | password_resets |
ArticleCategory | article_categories |
테이블명을 모델명으로 전환하는 코드는 다음과 같이 Helper 함수를 사용하여 만들수 있습니다. 팅커를 실행한 후에 다음 명령어를 입력해 봅시다.
$ php artisan tinker
>>> str_singular(studly_case('article_categories'))
=> "ArticleCategory"
만약 테이블 이름이 관례를 따르지 않고 작명되었다면 $table 변수에 테이블 이름을 직접 기술해 주면 됩니다.
class Task extends Model
{
protected $table = 'my_tasks_table';
DB 연결 정보
eloquent 는 config/database.php 에 default 로 설정된 데이타베이스 정보를 사용합니다. 만약 현재 모델이 default 가 아닌 다른 데이타베이스를 사용해야 한다면 $connection 변수에 사용하는 데이타베이스 이름을 기술해 주면 됩니다.
'default' => 'mysql',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path().'/database.sqlite',
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
],
config/database.php 은 위와 같이 default 는 mysql 로 설정되어 있지만 Task 모델은 sqlite 를 사용할 경우 다음과 같이 $connection 변수에 사용할 데이타베이스 이름인 sqlite 를 설정해 주면 됩니다.
class Task extends Model
{
protected $connection = 'sqlite';
기본 키(Primary Key)
eloquent 는 기본 키 컬럼으로 id 라는 이름의 컬럼을 사용합니다. 만약 id 가 아닌 다른 컬럼이 기본키라면 $primaryKey 변수에 기본 키 컬럼명을 설정해 주면 됩니다.
class Task extends Model
{
protected $primaryKey = 'task_id';
타임스탬프와 dates
eloquent 는 모든 테이블에 레코드의 생성일을 담고 있는 created_at 컬럼과 레코드의 최종 갱신일을 담고 있는 updated_at 이라는 두개의 DATETIME 컬럼이 있다고 가정합니다. 만약 이 컬럼이 없는 테이블일 경우 INSERT/UPDATE 가 실패하게 되므로 $timestamps 변수를 false 로 설정해 주면 됩니다.
class Task extends Model
{
public $timestamps = 'false';
eloquent 는 created_at, updated_at 같은 DATETIME 컬럼이 있을 경우 PHP의 DateTime 클래스를 상속받은 Carbon 클래스로 만들어 주므로 손쉽게 날자와 시간을 다룰 수 있으며 별도의 DATETIME 컬럼이 있을 경우 $dates 배열에 추가해주면 됩니다.
class Task extends Model
{
protected $dates= ['due_date', 'assigned_date'];
$dates 에 지정하지 않을 경우 해당 컬럼은 문자열로 처리되므로 다루기가 불편해 지며 $dates 항목을 설정했을 경우와 주석 처리한 경우로 나눠서 artisan tinker 를 통해서 확인해 봅시다.
$dates 설정
>>> get_class(App\Task::find(1)->due_date)
=> "Carbon\Carbon"
$dates 항목이 설정되지 않을 경우 get_class() 는 "파라미터가 object 가 아닌 스트링"이라는 경고를 출력합니다.
$dates 미 설정
>>> get_class(App\Task::find(1)->due_date)
PHP warning: get_class() expects parameter 1 to be object, string given on line 1
$dates 를 수정했으면 팅커 재구동해야 설정이 반영됩니다.
DATETIME 을 문자열로 변환할 경우 기본 날자/시간 포맷은 "2013-11-23 02:56:02" 같이 표현됩니다. 다른 형식으로 날자를 표시하기를 원할 경우 $dateFormat 변수에 원하는 포맷을 설정하면 됩니다.
날자 형식에 대한 추가 정보는 PHP 의 DateTime 클래스(http://php.net/manual/en/class.datetime.php)를 참고하면 됩니다.
class Task extends Model
{
protected $dateFormat = "Y-m-d H:i:s";
이제 대표적인 관례에 대해서 알아보았으니 eloquent 에서 데이타를 가져오고 넣어주는 방법에 대해서 알아 봅시다.