라라벨 DB Eloquent ORM

Code 2018.11.16 16:40


< Eloquent ORM>

(Object Relational Mapping)

https://laravel.kr/docs/5.5/eloquent


- 모델 정의

php artisan make:model User -m



* 관례 설정

- 관례와 다를 경우 설정


class User extends Authenticatable

{

//테이블 이름 , 기본= 모델명의 복수

protected $table = 'users';


//기본키, 기본=id

protected $primaryKey = 'id';


//

//public $timestamps = false;//created_at, updated_at 칼럼이 없을때

//protected $connection = 'connection-name';//별도의 DB커넥션 사용


//대량할당 (create, fill)

//protected $fillable = ['name'];//대량할당 사용시, 허용할 칼럼 등록

//protected $guarded = ['price'];//대량할당 제외



//==========

* 조회

use App\Model\Question as mques;


$ques = mques::where('id', '>=', 1);//리턴 Builder

     

$ques = $ques->get();//리턴 Collection

     

$ques = $ques->all();//리턴 Array



//========

* Insert


  $flight = new Flight;

  $flight->name = $request->name;

  $flight->save();// created_at와 updated_at가 자동 설정



//========

* update


- 1개 업데이트

$flight = App\Flight::find(1);

$flight->name = 'New Flight Name';

$flight->save();



- 여러개 update

App\Flight::where('active', 1)

          ->where('destination', 'San Diego')

          ->update(['delayed' => 1]);



/=====================

* 대량할당

create(), fill()을 이용해 레코드 추가

protected $fillable = ['name'];에 등록해야 함



$flight = App\Flight::create(['name' => 'Flight 10']);


- 이미 인스턴스가 있는 경우

$flight->fill(['name' => 'Flight 22']);



//==================================================

* 관계


//=======================

< 1:1 관계 >

- 예) 사용자 - 프로파일, (users - profiles)

- 외래키는 profiles에만 생성

//=========

//User 모델

class User extends Model

{

public function profile()

{

return $this->hasOne('App\Model\Profile');//관례를 따른 경우

return $this->hasOne('App\Model\Profile', 'user_id2', 'id2');//관례와 다른 경우 값도 설정

- 관례적(묵시적)으로 profile테이블이 외래키로 users테이블의 id칼럼을

user_id칼럼 이름으로 생성해서 외래키로 설정했을 것으로 정함


//===========

//Profile 모델

class Profile extends Model

{

public function user()

{

return $this->belongsTo('App\Model\User');//관례를 따른 경우

return $this->belongsTo('App\Model\User', 'user_id2', 'id2');//관례와 다른 경우 값도 설정



- 사용

$prof = User::find(1)->profile;//프로파일 클래스 반환


$prof = User::where('id', '>=', 1)->get();//컬렉션

$prof[0]->profile;//접근



//========================

< 1:다 관계 >

- 가장 흔한 경우

- 예) 사용자 - 주문, (users - orders)

- 사용자 모델

public function orders(){

return $this->hasMany('App\Modes\Order');

return $this->hasMany('App\Modes\Order', 'foreign_key', 'local_key');

}



- 주문 모델

public function user(){

return $this->belongsTo('App\Modes\User');

return $this->belongsTo('App\Modes\User', 'foreign_key', 'local_key');

}


- 사용

$orders = App\Modes\User::find(1)->orders;

foreach ($orders as $order) {

    //

}


- where 사용

$rets = User::where('id','=', 1)->get();

foreach( $rets[0]->order as $order){

          dump($order);

}



//========================

< 다:다 관계 >


- 예) 사용자 - 역할 (users - roles)

사용자 - 상품 (users - products)

  - 각각의 테이블에 외래키는 없음

  - 중간 테이블(피봇 테이블) 필요 : 

테이블 이름 관례 : 알파벳 순 - role_user

칼럼 : id, role_id, user_id , created_at, updated_at


사용자 모델

public function roles() {

return $this->belongsToMany('App\Models\Role');//관례를 지킨 경우

return $this->belongsToMany('App\Models\Role', 'role_user2', 'user_id2', 'role_id2');//관례와 다른 경우, 

}


직접 설정

- 중간테이블 이름, 현재 모델의 기본키, 상대 모델의 기본키


역할 모델

class Role extends Model  

{

    public function users()

    {

        return $this->belongsToMany('App\User');

}


//=========

- 사용

$user = App\Models\User::find(1);

foreach($user->roles as $role){

...

echo $role->pivot->created_at;//중간 테이블도 조회 가능

}



//============

관계 연결

country -> user -> post


return $this->hasManyThrough('App\Post', 'App\User');//(최종목적지, 중간경유지) 


- 관례를 따르지 않은 경우 직접 설정

return $this->hasManyThrough(

            'App\Post',

            'App\User',

            'country_id', // Foreign key on users table...

            'user_id', // Foreign key on posts table...

            'id', // Local key on countries table...

            'id' // Local key on users table...

        );



- 사용

$rets = User::find(1)->projects->find(1);

foreach($rets->tasks as $task){

            dump($task->name);

        }



//===============

다형성 관계 

https://www.lesstif.com/pages/viewpage.action?pageId=27984056

- 여러개의 모델이 서로 관계, SQL로 표현 못함

-> 학습 건너뜀

morphTo()



//=================

관계 쿼리 질의하기

https://laravel.kr/docs/5.5/eloquent-relationships#querying-relations


- 1개 이상의 댓글이 있는 포스트

$posts = App\Post::has('comments')->get();

- has 반대 함수 = doesntHave


- whereHas (has의 확장판)

$posts = App\Post::whereHas('comments', function ($query) {

    $query->where('content', 'like', 'foo%');

})->get();


- withCount : 연관된 갯수 세기

$posts = App\Post::withCount('comments')->get();




//=================

Eager 로딩


* N+1문제 상황

$books = App\Book::all();

foreach ($books as $book) {

    echo $book->author->name;//관계된 테이블을 매회 조회

}


* eager 로딩으로 2회로 해결

$books = App\Book::with('author')->get();

foreach ($books as $book) {

    echo $book->author->name;

}


- 실제 실행된 퀴리

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...)



* 이거 로딩 제한

$users = App\User::with(['posts' => function ($query) {

    $query->where('title', 'like', '%first%');

}])->get();



'Code' 카테고리의 다른 글

[JavaScript] jQuery 나라별 언어 국제화 방법  (0) 2018.11.27
[라라벨] 즉시로딩 (Eager Loading) 사용 예제  (0) 2018.11.20
라라벨 DB Eloquent ORM  (0) 2018.11.16
라라벨 DB 빌더  (0) 2018.11.16
라라벨 컬렉션  (0) 2018.11.16
Visual studio code 사용법  (0) 2018.11.13
Posted by 코덴스
TAG

댓글을 달아 주세요