테이블과 모델명

전 절에서 artisan make:model 로 생성한 할일에 대한 모델 파일인 app/Task.php 를 다시 열어 봅시다.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    
}
CODE

모델과 일치하는 테이블명이 기술되어 있지 않지만 모델 클래스는 테이블 이름을 StudlyCase 형식의 문자로 만들고 단수형으로 사용하는 관례가 있습니다.

모델테이블
Tasktasks
PasswordResetpassword_resets
ArticleCategoryarticle_categories

테이블명을 모델명으로 전환하는 코드는 다음과 같이 Helper 함수를 사용하여 만들수 있습니다. 팅커를 실행한 후에 다음 명령어를 입력해 봅시다.

$ php artisan tinker
 
>>>  str_singular(studly_case('article_categories'))
=> "ArticleCategory"
CODE

 

만약 테이블 이름이 관례를 따르지 않고 작명되었다면 $table 변수에 테이블 이름을 직접 기술해 주면 됩니다.

class Task extends Model
{
	protected $table = 'my_tasks_table';
CODE

 

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',          
        ],
CODE

config/database.php 은 위와 같이 default 는 mysql 로 설정되어 있지만 Task 모델은 sqlite 를 사용할 경우 다음과 같이 $connection 변수에 사용할 데이타베이스 이름인 sqlite 를 설정해 주면 됩니다.

class Task extends Model
{
	protected $connection = 'sqlite';
CODE

기본 키(Primary Key)

eloquent 는 기본 키 컬럼으로 id 라는 이름의 컬럼을 사용합니다. 만약 id 가 아닌 다른 컬럼이 기본키라면 $primaryKey 변수에 기본 키 컬럼명을 설정해 주면 됩니다.

class Task extends Model
{
	protected $primaryKey = 'task_id';
CODE

 

타임스탬프와 dates

eloquent 는 모든 테이블에 레코드의 생성일을 담고 있는 created_at 컬럼과 레코드의 최종 갱신일을 담고 있는 updated_at 이라는 두개의 DATETIME 컬럼이 있다고 가정합니다. 만약 이 컬럼이 없는 테이블일 경우 INSERT/UPDATE  가 실패하게 되므로 $timestamps 변수를 false 로 설정해 주면 됩니다.

class Task extends Model
{
	public $timestamps = 'false';
CODE

 

eloquent 는 created_at, updated_at 같은 DATETIME 컬럼이 있을 경우 PHP의 DateTime 클래스를 상속받은 Carbon 클래스로 만들어 주므로 손쉽게 날자와 시간을 다룰 수 있으며 별도의 DATETIME 컬럼이 있을 경우 $dates 배열에 추가해주면 됩니다.

class Task extends Model
{
	protected $dates= ['due_date', 'assigned_date'];
CODE

$dates 에 지정하지 않을 경우 해당 컬럼은 문자열로 처리되므로 다루기가 불편해 지며 $dates 항목을 설정했을 경우와 주석 처리한 경우로 나눠서 artisan tinker 를 통해서 확인해 봅시다. 

$dates 설정

>>> get_class(App\Task::find(1)->due_date)
=> "Carbon\Carbon"
CODE

$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
CODE

$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";
CODE

이제 대표적인 관례에 대해서 알아보았으니 eloquent 에서 데이타를 가져오고 넣어주는 방법에 대해서 알아 봅시다.