< 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 > PHP' 카테고리의 다른 글

[라라벨] where 그룹 (블록)  (0) 2018.12.16
[라라벨] 즉시로딩 (Eager Loading) 사용 예제  (0) 2018.11.20
라라벨 DB Eloquent ORM  (0) 2018.11.16
라라벨 DB 빌더  (0) 2018.11.16
라라벨 컬렉션  (0) 2018.11.16
[W3Schools] PHP 정리  (0) 2018.11.09
Posted by 코덴스
TAG

댓글을 달아 주세요