아무거나

옐로퀀트ORM 활용 본문

PHP/Laravel

옐로퀀트ORM 활용

전봉근 2019. 4. 4. 10:24
반응형

[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
Comments