XE 오픈 세미나
2015. 5. 20
오퍼니티 이현석
Todo List 를 따라 만들어보며 Laravel의 ORM과 DB 기능을 익혀봅시다
(딱 필요한 만큼만!)
migration
schema builder
eloquent orm
csrf 토큰
request
DB 파사드
쿼리 빌더
redirection
blade 에서의 foreach 와 if
RESTful 리소스 컨트롤러
데이터베이스 호스트와 아이디 비밀번호 값을 설정해줍니다.
select 는 read,
insert 와 update 는 write 에 설정한 값을 사용
Laravel이 기본으로 제공하는 회원인증 기능과 관련된 테이블들이 생성됩니다.
database/migrations 폴더에
create_todos_table.php 파일이 생성됩니다.
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');
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::get('/', 'MainController@index');
php artisan make:controller MainController
resources/views/main.blade.php 를 생성해주세요.
main.blade.php 에 폼을 만들어줍시다
<form method="post" action="/todo">
<label>할일</label>
<input type="text" name="title">
<input type="submit">
</form>
php artisan make:controller TodoController
Route::post('/todo', 'TodoController@store');
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();
}
use DB;
DB::insert('insert into todos (title) VALUES (?)', [$request->input('title')]);
DB::table('todos')->insert(['title' => $request->input('title')]);
라라벨에 포함된 Eloquent ORM은 여러분의 데이터베이스와 동작하는 아름답고 심플한 액티브 레코드를 제공합니다. 각각의 데이터베이스 테이블은 이에 해당하는 "모델”을 가지고 있습니다.
php artisan make:model Todo
앗! 커맨드를 이용해서 만들면 마이그레이션 파일도 함께 만들어주는군요! 참고합시다~
$todo = new Todo();
$todo->title = $request->title;
$todo->save();
Todo::create(['title' => $request->input('title')]);
$todo = Todo::firstOrCreate(['title' => $request->input('title')]);
찾아보고 없으면 DB에 추가.
$todo = Todo::firstOrNew(['title' => $request->input('title')]);
찾아보고 없으면 인스턴스 생성.
조작 가능한 속성을 지정해줌으로서 보안을 강화합니다.
fillable - 조작 가능한 속성을 지정(white-list)
guarded - 보호해야할 속성을 지정(black-list)
class Todo extends Model {
protected $fillable = ['title', 'box_id'];
}
return redirect('/');
$todos = Todo::all();
laravel의 기본 템플릿 엔진
@foreach ($todos as $todo)
<p> {{ $todo['title'] }}</p>
@endforeach
@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 컨트롤러를 손쉽게 구성할 수 있게 해줍니다.
Route::resource('todo', 'TodoController');
php artisan route:list
public function destroy($id)
{
$todo = Todo::find($id);
$todo->delete();
return redirect('/');
}
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();
php artisan make:model Box
php artisan make:controller BoxController
Todos::where('todos.box_id', '=', 1)->get();
class Box extends Model {
public function todo()
{
return $this->hasMany('App\Todo');
}
}
$count = User::where('votes', '>', 100)->count();