일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- IntelliJ
- Git
- Web Server
- 요리
- devops
- php
- db
- Spring Boot
- jsp
- Spring Batch
- MySQL
- jenkins
- elasticsearch
- ubuntu
- tool
- javascript
- Gradle
- laravel
- it
- java
- Spring
- springboot
- JVM
- linux
- Oracle
- AWS
- redis
- Design Patterns
- 맛집
- ReactJS
- Today
- Total
아무거나
옐로퀀트ORM 활용 본문
[DB 저장]
DB에 저장하는 방법은 db파사드, 쿼리빌더, 옐로퀀트ORM 등이 있다.
1. DB파사드 사용
[소스내용]
use DB;
public function store(Request $request) {
$title = $request->input('title');
DB::insert('insert into lecture (title) VALUES (?)', [$title]);
}
2. 쿼리빌더 사용
[소스사용]
use DB;
public function store(Request $request) {
$title = $request->input('title');
DB::table('lecture')->insert(['title' => $title]); // 쿼리빌더
}
3. 옐로퀀트ORM 으로 데이터 저장 및 페이지 이동
- 액티브 레코드라도 하는데 각각의 데이터베이스 테이블은 이에 해당하는 모델을 가지고 있다.
즉, 테이블을 만들면 모델을 하나하나 생성해준다.
* 모델은 단수형 테이블은 모델의 복수형으로 하는게 규칙으로 되어있다.
만약, 테이블을 모델의 복수형으로 사용안할 경우에는 모델에서 커스텀 테이블을 지정해준다.
매번 이렇게 하기 귀찮아서 라라벨규칙을 하지만 확장성을 위하여 커스텀 테이블을 사용하자.
-> protected $table = 'lecture';
- php artisan make:model Lecture // 모델생성
- 저장하는 소스를 만들자
[소스]
// case 1
$lecture = new Lecture();
$lecture->title = $title;
$lecture->save();
// case 2
Lecture::create([
'title' => $title
]);
- $lecture = Lecture::firstOrCreate(['title'=>$request->input('title')]); // 찾아보고 없으면 DB에 추가
- $lecture = Lecture::firstOrNew(['title'=>$request->input('title')]); // 찾아보고 없으면 인스턴스 생성
- 해당 내용을 기반으로 호출을하여 데이터를 insert하자
만약 Mass Assignment라는 오류가 생기면 이 오류는 보안을 위해서 라라벨이
fillable와 guarded을 지정하라는 것이다.
[모델의 소스내용]
// 매번 값을 입력할 수 있는 컬럼을 지정해줘야된다.
protected $fillable = ['title'];
// guarded 설명..
protected $guarded = [*]; // 어떠한 컬럼도 쓸 수 없다.
protected $guarded = ['title']; // title 빼고 다 쓴다.
그러므로 주로 $fillable을 많이 쓴다.
- return redirect('/'); // 페이지 이동
4. 옐로퀀트ORM 모든 레코드 가져오기
- 위 내용중 아까 MainController로 이동하여 소스를 작성
[소스]
use App\Lecture
public function index() {
$lectures = Lecture::all();
// view로 데이터를 넘겨주는건 아래 둘 중 아무거나 써도되는데 compact가 깔끔하니 이걸로 사용하자
return view('main', compact('lectures'));
//return view('main', ['lectures'=>$lectures]);
}
[뷰 소스]
// blade foreach 문법
@foreach($lectures as $lecture)
<p>{{ $lecture['title'] }}</p> // {{ }} 는 echo와 똑같은 효과를 나타낸다.
@endforeach
- 위의 foreach 말고 다른 반복문
@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 forever.</p>
@endwhile
5. 완료 버튼 추가
- php artisan make:migration AddDoneToTodosTable
- done 컬럼을 생성해주자
[소스]
Schema::table('lecture', function($table){
$table->tinyInteger('done');
});
- php artisan migrate
- Route::post('todo/done/{id}', 'TodoController@done'); // 라우트 추가
- 위에 예제를 기반으로 main view를 수정한다
[소스]
@foreach($lectures as $lecture)
<p>
{{ $lecture['title'] }}
// 추가
<form method="post" action="/todo/done/{{ $lecture->no }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="submit" value="완료">
</form>
</p>
@endforeach
- 위 소스를 작성후 done 값을 저장할 메서드를 만들자
[소스]
public function done($no) {
$lecture = Lecture::find($no);
$lecture->done = 1;
$lecture->save();
return redirect('/');
}
// 만약 DB의 pk값이 id가 아닐경우 커스텀을 해주자
protected $primaryKey = 'no';
protected $fillable = ['title', 'done']; // 제어할 수 있는 필드도 추가하자
6. 완료된 항목을 취소버튼으로 바꿔준다.
[소스:메소드]
public function done($no) {
$lecture = Lecture::find($no);
if($lecture->done == 1) {
$lecture->done = 0;
} else {
$lecture->done = 1;
}
$lecture->save();
return redirect('/');
}
뷰도 분기처리하여 취소버튼을 만들어주자
7. RESTful 리소스 컨트롤러
* 정의
# public function index() {} // 목록을 보여주는 역할[GET]
# public function create() {} // 작성하는 화면을 보여주는 역할[GET]
# public function store() {} // create()에서 작성한 내용을 실제 DB에 넣는 역할 [POST]
# public function show($id) {} // 목록에서 선택된 데이터를 출력하는 역할을 수행(작성된 내용 확인) -> 상세 [GET]
# public function edit($id) {} // 데이터 수정 [GET]
# public function update($id) {} // edit()에서 변경한 내용을 실제 DB에 update하는 역할 수행 [PUT | PATCH]
# public function destroy($id) {} // 데이터를 삭제하느 역할 수행 [DELETE]
- php artisan route:list // 현재 사용하고 있는 route의 목록을 표시
- route에 Route::resource('todo', 'TodoController'); 추가해주고 php artisan route:list명령을 치면 이거에 대한 restful정의로 라우트를 다 만들어준다.
- 뷰에 폼을 추가하자
[소스]
<form method="post" action="/todo/{{ $lecture->no }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="삭제">
</form>
* HTML form은 실제로 PUT, PATCH, DELETE 액션을 지원하지 않는다. 따라서 PUT, PATCH이나 DELETE로 지정된 라우트를 호출하는 HTML form을
정의한다면 _method의 숨겨진 필드를 지정해야 한다
ex) <input type="hidden" name="_method" value="DELETE">
8. 소프트 삭제(실제로 삭제되지 않고 삭제되었다고 표시만 하기)
- 마이그레이션에 소스 추가
Schema::table('lecture', function() {
$table->softDeletes();
});
- 모델에 소스 추가
use Illuminate\Database\Eloquent\SoftDeletes;
class Lecture extends Model {
use SoftDeletes;
protected $dates = ['deleted_at'];
}
9. 강제로 삭제된 모델들을 결과에 포함 시키기
- $lectures = Lecture::withTrashed()->get(); // 소프트삭제된 데이터도 전부 가져오기
- $lectures = Lecture::onlyTrashed()->get(); // 삭제된 데이터만 조회하기
- $user->restore(); // 소프트삭제된 데이터를 활성화로 복구
'PHP > Laravel' 카테고리의 다른 글
Eloquent + Pagination 사용 (0) | 2019.04.05 |
---|---|
validator(유효성검증) (0) | 2019.04.04 |
뷰 생성(blade) 및 데이터 표시(템플릿 엔진 활용방법) (0) | 2019.04.04 |
마이그레이션 (0) | 2019.04.03 |
XSS 적용 방법 (0) | 2019.04.03 |