Laravel 5 ORM, DB

XE 오픈 세미나

2015. 5. 20

오퍼니티 이현석

오늘의 목표

Todo List 를 따라 만들어보며 Laravel의 ORM과 DB 기능을 익혀봅시다

(딱 필요한 만큼만!)

오늘 다룰 것들

migration

schema builder

eloquent orm

csrf 토큰
request 
DB 파사드
쿼리 빌더
redirection
blade 에서의 foreach 와 if
RESTful 리소스 컨트롤러

오늘 만들 거

오늘 만들 거

  • 사용자는 '할 일' 을 생성, 수정, 삭제, 조회 할 수 있다.
  • 사용자는 '박스' 을 생성, 수정, 삭제, 조회 할 수 있다. 
  • '할 일'은 하나의 '박스'에 포함되어야 한다.

오늘의 도우미 소개

데이터베이스 설정하기

config/database.php

데이터베이스 호스트와 아이디 비밀번호 값을 설정해줍니다.

읽기용 / 쓰기용 커넥션

select 는 read,

insert 와 update 는 write 에 설정한 값을 사용 

첫번째 마이그레이션

php artisan migrate

Laravel이 기본으로 제공하는 회원인증 기능과 관련된 테이블들이 생성됩니다.

'할 일' 테이블을 만들어봅시다

  1. MySQL 에 콘솔로 접근하여 쿼리로 생성
  2. 클라이언트 프로그램에서 생성
  3. Laravel의 마이그레이션 기능을 사용하여 생성

Laravel 의 migration 기능을 사용하면 

  • 동료들과 DB스키마를 쉽게 공유할 수 있다.
  • migration 이력이 남는다. 

php artisan make:migration create_todos_table

database/migrations 폴더에

create_todos_table.php 파일이 생성됩니다.

Schema Builder

DB 종류에 상관없이 DB를 조작할 수 있게 해 줍니다

http://xpressengine.github.io/laravel-korean-docs/docs/5.0/schema/

테이블 생성

Schema::create('todos', function($table)
{
    $table->increments('id');
});

테이블 삭제

Schema::drop('todos');

Schema::dropIfExists('todos');

DB 마이그레이션 롤백하기

php artisan migrate:rollback

컬럼 추가

Schema::table('todos', function($table)
        {
            $table->string('title');

            $table->timestamps();
        });

created_at 컬럼과 updated_at 컬럼을 만들어 줍니다.

컬럼 삭제

if (Schema::hasColumn('todos', 'title'))
{
    Schema::table('todos', function($table)
        {
            $table->dropColumn('title');
        });
}

할 일 만들기

기능을 만들어 봅시다

Route를 수정해주세요 

Route::get('/', 'MainController@index');

Main 컨트롤러 추가

php artisan make:controller MainController

view를 만들어봅시다

resources/views/main.blade.php 를 생성해주세요.

할 일 만들기 폼

main.blade.php 에 폼을 만들어줍시다

<form method="post" action="/todo">
    <label>할일</label>
    <input type="text" name="title">
    <input type="submit">
</form>

Todo 컨트롤러 추가

php artisan make:controller TodoController

제출한 폼을 처리할 route 등록

Route::post('/todo', 'TodoController@store');

제출!

CSRF 토큰

Laravel은 크로스 사이트 요청 위조를 방지 하기 위한 편리한 기능을 제공합니다

폼에 아래 내용을 추가해주세요.

<input type="hidden" name="_token" value="{{ csrf_token() }}">

 

http://xpressengine.github.io/laravel-korean-docs/docs/5.0/routing/#csrf-protection

전송된 값을 확인해봅시다

 

public function store(Request $request)

{

    dd($request->all();

}

DB 에 저장해봅시다

DB 파사드를 이용하는 방법

 

use DB;

 

DB::insert('insert into todos (title) VALUES (?)', [$request->input('title')]);

쿼리 빌더를 사용하는 방법

DB::table('todos')->insert(['title' => $request->input('title')]);

Eloquent ORM을 사용하는 방법

Eloquent ORM

라라벨에 포함된 Eloquent ORM은 여러분의 데이터베이스와 동작하는 아름답고 심플한 액티브 레코드를 제공합니다. 각각의 데이터베이스 테이블은 이에 해당하는 "모델”을 가지고 있습니다.

Model 생성

php artisan make:model Todo

앗! 커맨드를 이용해서 만들면 마이그레이션 파일도 함께 만들어주는군요! 참고합시다~

새로운 모델 저장하기

$todo = new Todo();
$todo->title = $request->title;
$todo->save();

create 메소드 사용하기

Todo::create(['title' => $request->input('title')]);


$todo = Todo::firstOrCreate(['title' => $request->input('title')]);

찾아보고 없으면 DB에 추가.


$todo = Todo::firstOrNew(['title' => $request->input('title')]);

찾아보고 없으면 인스턴스 생성.

Mass Assignment

조작 가능한 속성을 지정해줌으로서 보안을 강화합니다.

fillable - 조작 가능한 속성을 지정(white-list)

guarded - 보호해야할 속성을 지정(black-list)

class Todo extends Model {

    protected $fillable = ['title', 'box_id'];

}

Redirection

return redirect('/');

할 일 목록을 조회해 봅시다

모든 레코드 가져오기

$todos = Todo::all();

blade 템플릿

laravel의 기본 템플릿 엔진

blade 에서의 foreach

@foreach ($todos as $todo)
    <p> {{ $todo['title'] }}</p>
@endforeach

blade 에서의 기타 반복문

@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

@forelse($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <p>No users</p>
@endforelse

@while (true)
    <p>I'm looping forever.</p>
@endwhile

완료 버튼을 추가해봅시다

마이그레이션

php artisan make:migration AddDoneToTodoTable

라우트 추가

Route::post('todo/done/{id}','TodoController@done');

컨트롤러에 메소드 추가

public function done($id)
    {
        $todo = Todo::find($id);
        $todo->done = 1;
        $todo->save();

        return redirect('/');
    }

완료된 항목은 표시를 해줍시다

완료된 항목은 완료 버튼을 취소 버튼으로 바꿔줍시다

삭제 버튼을 추가해봅시다

라우트 추가... 귀찮네요!

RESTful 리소스 컨트롤러

리소스 컨트롤러는 리소스에 대한 RESTful 컨트롤러를 손쉽게 구성할 수 있게 해줍니다.

 

Route::resource('todo', 'TodoController');

등록된 Route 확인

php artisan route:list

컨트롤러에 메소드 추가

public function destroy($id)
    {
        $todo = Todo::find($id);
        $todo->delete();

        return redirect('/');
    }

Method 속이기

HTML form은 실제로 PUT, PATCH 와 DELETE 액션을 지원하지 않습니다. 따라서 PUT, PATCH 이나 DELETE 로 지정된 라우트를 호출하는 HTML form을 정의한다면 _method 의 숨겨진 필드를 지정해야 합니다.

<form method="post" action="/todo/{{ $todo->id }}">
    <input type="hidden" name="_method" value="DELETE">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="submit" value="삭제">
</form>

소프트 삭제

실제로 삭제하지 않고, 삭제되었다고 표시만 하기

마이그레이션

Schema::table('todos', function($table) {

    $table->softDeletes();

});

모델 수정

use Illuminate\Database\Eloquent\SoftDeletes;

class Todo extends Model {

    use SoftDeletes;

    protected $dates = ['deleted_at'];

}

강제로 삭제된 모델들을 결과에 포함시키기

$todos = Todo::withTrashed()->get();

삭제된 모델들만 조회하기

$todos = Todo::onlyTrashed()->get();

삭제된 모델 복원하기

$todo->restore();

쿼리스코프

모델 안에서 로직을 쉽게 재사용할 수 있게 해줍니다.

 

쿼리 스코프 정의

메소드명 앞에 scope 를 붙여줍니다..

class Todo extends Model {

    public function scopeImportant($query)
    {
        return $query->where('isImportant', '=', 1);
    }

}

쿼리 스코프 사용하기

$importantTodos = Todo::important()->get();

할 일 구분(박스)을 만들어봅시다.

Box 모델 생성

php artisan make:model Box

Box 컨트롤러 생성

php artisan make:controller BoxController

마이그레이션 작성 및 실행

/에 폼추가 및 박스 목록 리스트 표현

박스별 Todo 목록을 조회해봅시다

박스를 지정하여 할 일 생성

조건절 사용하기

Todos::where('todos.box_id', '=', 1)->get();

Eloquent ORM 관계 사용하기 - hasMany

class Box extends Model {

    public function todo()
    {
        return $this->hasMany('App\Todo');
    }
}

Eloquent ORM 관계 사용하기 - belongsTo

Eloquent 합계

$count = User::where('votes', '>', 100)->count();

수고하셨습니다

Laravel 5 ORM, DB

By Hyun-Seok Lee

Laravel 5 ORM, DB

  • 5,367