PHP 의 Laravel 프레임 워 크 에서 Eloquent 개체 관계 맵 사용

10413 단어 PHPLaravelEloquent
제로,Eloquent 가 무엇 입 니까?
Eloquent 는 Laravel 의'ORM',즉'Object Relational Mapping'으로 대상 관계 가 매 핑 됩 니 다.ORM 의 등장 은 데이터베이스 에 대한 조작 을 더욱 편리 하 게 해 주기 위해 서 이다.
Eloquent 는'Model 클래스'에 대응 하 는 데이터베이스 시트 를 만 들 고 바 텀 에'function'을 많이 밀봉 하여 Model 류 를 편리 하 게 호출 할 수 있 습 니 다.
다음 코드 를 보십시오.

<?php

class Article extends \Eloquent {

protected $fillable = [];

}

'protected $fillable = [];' 이 코드 는 여기에서 아무런 가치 가 없습니다.generator 가 자동 으로 생 성 된 것 입 니 다.여기 서 우 리 는 토론 하지 않 습 니 다.
이 종 류 는 정말 간단 합 니 다.네 임 스페이스 를 지정 하지 않 고 구조 함수 가 없습니다.만약 에 그 의미 없 는 코드 도 포함 되 지 않 는 다 면 이 파일 은 실제 적 인 의미 가 있 는 두 가지 만 있 습 니 다.'Article'과'\Eloquent'입 니 다.맞습니다.Eloquent 는 바로 이렇게 밭 을 갈 고 12556°입 니 다.이것 이 바로 Eloquent 류 를 계승 하면'first()find()where()orderby()'등 매우 많은 일 을 할 수 있 습 니 다.이것 이 바로 대상 을 대상 으로 하 는 강력 한 위력 입 니 다.
1.Eloquent 기본 용법
Eloquent 중국어 문 서 는 다음 과 같 습 니 다.http://laravel-china.org/docs/eloquent
잔말 말고 Eloquent 의 몇 가지 흔 한 용법 코드 를 직접 보 여 드 리 겠 습 니 다.
id 가 2 인 글 을 찾 아 제목 을 인쇄 합 니 다.

$article = Article::find(2);

echo $article->title;

제목 이'나 는 제목'인 글 을 찾 고 id 를 인쇄 합 니 다.

$article = Article::where('title', '    ')->first();

echo $article->id;

모든 글 을 조회 하고 모든 제목 을 반복 적 으로 인쇄 합 니 다.

$articles = Article::all(); //       $articles        ,        '->toArray()'       。

foreach ($articles as $article) {

  echo $article->title;

}

id 10~20 사이 의 모든 글 을 찾 고 모든 제목 을 인쇄 합 니 다.

$articles = Article::where('id', '>', 10)->where('id', '<', 20)->get();

foreach ($articles as $article) {

  echo $article->title;

}

모든 글 을 조회 하고 모든 제목 을 반복 해서 인쇄 합 니 다.updatedat 역순 정렬

$articles = Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();

foreach ($articles as $article) {

  echo $article->title;

}

기초 사용 요점
1.Eloquent 를 계승 한 클래스 마다 두 개의'고정 용법''rticle:find($number)''rticle::all()'이 있 습 니 다.전 자 는 데이터베이스 에서 값 을 추출 하 는 대상 을 얻 고 후 자 는 전체 데이터 베 이 스 를 포함 하 는 대상 집합 을 얻 을 수 있 습 니 다.
2.모든 중간 방법,예 를 들 어'where()','orderby()'등 은'정적'과'비 정적 체인'두 가지 방식 으로 호출 할 수 있 습 니 다.즉,'rticle::where()'와'rticle::...->where()'입 니 다.
3.모든'비 고정 용법'호출 은 마지막 에 하나의 조작 으로'마무리'가 필요 합 니 다.이 튜 토리 얼 에는'마무리 작업':'->get()'과'->first()'가 두 개 있 습 니 다.
2.중간 작업 흐름
Builder 라 는 단 어 는 구조 기 로 직역 할 수 있 지만'중간 작업 흐름'은 이해 하기 쉽다.데이터 베 이 스 를 조작 할 때 대부분 체인 으로 작 동 하기 때문이다.
중간 작업 흐름,코드 를 보십시오:

Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();
이 코드 의`:where()->where()->orderby()`는 중간 작업 흐름 입 니 다.중간 작업 흐름 은 대상 을 대상 으로 하 는 방법 으로 이해 하면 한 마디 로 요약 할 수 있다.
대상 을 만 들 고 속성 을 계속 수정 하 며 마지막 으로 하나의 조작 으로 데이터 베 이 스 를 실행 합 니 다.
어떻게 중간 조작 흐름 의 실 마 리 를 찾 습 니까?
중간 작업 흐름 이라는 것 은 문서 에 가치 있 는 정보 가 거의 없다.그러면 우 리 는 어떻게 이 물건 을 찾 아야 합 니까?간단 합 니 다.다음 코드 를 사용 하 십시오.

$builder = Article::where('title', "    ")->title;
그리고 다음 과 같은 실 수 를 볼 수 있 습 니 다.
2016226161019074.jpg (929×97)
왜 오류 가 발생 했 습 니까?왜냐하면`Article::where()`이후 에 도`Builder`의 대상 이 고`Article`의 대상 이 아니 므 로`title`을 직접 취 할 수 없다.
'터 미 네 이 터'방법
이른바'터 미 네 이 터'방법 이란 N 개의 중간 조작 흐름 방법 으로 특정한 Eloquent 대상 을 가공 한 후에 최종 데이터베이스 조회 조작 을 촉발 하여 반환 값 을 얻 는 것 을 말한다.
`first()`get()`paginate()`count()`delete()`는 비교적 많은'종결자'방법 을 사용한다.그들 은 중간 작업 흐름 의 마지막 에 나타 나 SQL 을 데이터베이스 에 걸 어 데 이 터 를 되 돌려 받 고 가공 을 통 해 Article 대상 이나 Article 대상 의 집합 을 되 돌려 준다.
복잡 한 용법 예시

Article::where('id', '>', '100')->where('id', '<', '200')->orWhere('top', 1)->belongsToCategory()->where('category_level', '>', '1')->paginate(10);

3.모델 간 관계(관련)
1.일대일 관계
말 그대로 두 모델 간 의 일대일 관 계 를 묘사 한 것 이다.이런 관 계 는 중간 표 가 필요 없다.
만약 에 저희 가 두 가지 모델 이 있 습 니 다.User 와 Account 는 각각 가입 사용자 와 소비자 에 대응 하고 그들 은 일대일 관계 입 니 다.그러면 만약 에 저희 가 Eloquent 가 제공 하 는 일대일 관계 방법 을 사용 하려 면 표 구 조 는 이렇게 해 야 합 니 다.

user: id ... ... account_id

account: id ... ... user_id

사용자 모델 에서 해당 하 는 Account 표 의 정 보 를 조회 해 야 한다 고 가정 하면 코드 는 이 렇 습 니 다.app/models/User.php`:

<?php

class User extends Eloquent {

 

 protected $table = 'users';

 public function hasOneAccount()

 {

   return $this->hasOne('Account', 'user_id', 'id');

 }

}

그리고 우리 가 이런 관 계 를 필요 로 할 때 어떻게 사용 해 야 합 니까?다음 과 같다.

$account = User::find(10)->hasOneAccount;
이때 얻 은'$account'는'account'류 의 인 스 턴 스 입 니 다.
여기 서 가장 어 려 운 점 은 뒤에 있 는 두 개의 foreign 입 니 다.key 와 localkey 의 설정 은 사용자 클래스 에서 hasOne 이 누구 든 두 번 째 인 자 는'user'라 는 것 을 기억 할 수 있 습 니 다.id,세 번 째 매개 변 수 는 일반적으로'id'입 니 다.앞의'find(10)'가 id=10 을 잠 갔 기 때문에 이 함수 에 대응 하 는 SQL 은'select*from account where user 입 니 다.id=10`。
이 코드 는 일대일 관 계 를 어떻게 사용 해 야 하 는 지 보 여 주 는 동시에 세 가지 정 보 를 전 달 했 습 니 다.이것 은 제 가 여러분 에 게 Eloquent 를 사용 할 때 제안 한 것 입 니 다.
(1).모든 모델 에 표 이름 을 지정 합 니 다.
(2).has one account 와 같은 관 계 는 간단 한'account()'가 아니 라'hasOne account()'라 고 쓰 여 있 습 니 다.
(3).모델 간 의 관 계 를 사용 할 때마다 모든 매개 변 수 를 쓰 고 생략 하지 마 세 요.
이에 따라 belongs To()관 계 를 사용 하면 이렇게 써 야 합 니 다.

<?php

class Account extends Eloquent {

 protected $table = 'accounts';

 

 public function belongsToUser()

 {

  return $this->belongsTo('User', 'user_id', 'id');

 }

}

2.한 쌍 의 다 중 관계
앞에서 일대일 관 계 를 사용 하 는 기초 방법 을 배 웠 으 니 뒤의 몇 가지 관 계 는 훨씬 간단 하 다.
우 리 는 새로운 모델 인 Pay,지불 기록 을 도입 했다.표 구 조 는 다음 과 같 아야 한다.

user: id ... ...

pay: id ... ... user_id

User 와 Pay 는 한 쌍 의 다 중 관 계 를 가진다.다시 말 하면 한 사용자 가 여러 개의 Pay 를 가 질 수 있다 는 것 이다.그러면 Pay 표 에'user'만 존재 한다.id 필드 면 됩 니 다.app/models/User.php`:

<?php

class User extends Eloquent {

 

 protected $table = 'users';

 public function hasManyPays()

 {

  return $this->hasMany('Pay', 'user_id', 'id');

 }

}

그리고 우리 가 이런 관 계 를 필요 로 할 때 어떻게 사용 해 야 합 니까?다음 과 같다.

$accounts = User::find(10)->hasManyPays()->get();
이때 얻 은'$accounts'는'Illuminate\Database\Eloquent\Collection'류 의 인 스 턴 스 입 니 다.여러분 도 이미 알 고 계 실 겁 니 다.여 기 는 간단 한'-'hasOne Account'가 아니 라'-'hasMany Pays()-'get()'입 니 다.왜 일 까요?여 기 는'hasMany'이기 때문에 대상 집합 을 조작 합 니 다.
상응하는 belongs To()의 용법 은 위의 일대일 관계 와 같다.

<?php

class Pay extends Eloquent {

 protected $table = 'pays';

 

 public function belongsToUser()

 {

  return $this->belongsTo('User', 'user_id', 'id');

 }

}

3.다 대 다 관계
다 대 다 관 계 는 이전의 관계 와 완전히 다르다.다 대 다 관 계 는 많은 불필요 한 데이터 가 발생 할 수 있 기 때문에 이전에 가지 고 있 던 표 로 저장 할 수 없다.
우 리 는 두 가지 모델 을 정의 합 니 다.Article 과 Tag 는 각각 문장 과 라벨 을 나타 내 고 그들 은 다 중 관계 입 니 다.표 구 조 는 다음 과 같 아야 한다.

article: id ... ...

tag: id ... ...

article_tag: article_id tag_id

Model 에서 사용:

<?php

class Tag extends Eloquent {

 protected $table = 'tags';

 

 public function belongsToManyArticle()

 {

  return $this->belongsToMany('Article', 'article_tag', 'tag_id', 'article_id');

 }

}

주의해 야 할 것 은 세 번 째 매개 변 수 는 본 유형의 id 이 고 네 번 째 매개 변 수 는 첫 번 째 매개 변수 와 같은 id 입 니 다.
사용 은 hasmany 와 같 습 니 다:

$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();
이곳 에 서 는 매우 복잡 한 상 대 를 얻 을 수 있 습 니 다.스스로`vardump()`。여러분 에 게 비결 을 하나 말씀 드 리 겠 습 니 다."var"dump()'이후 크롬 오른쪽 버튼 으로'소스 코드 보기'를 누 르 면 매우 가지런 한 대상/배열 이 펼 쳐 지 는 것 을 볼 수 있다.
여기 서 여러분 에 게 보기 드 문 용법 을 보 여 드 리 겠 습 니 다.

public function parent_video()

{

  return $this->belongsToMany($this, 'video_hierarchy', 'video_id', 'video_parent_id');

}

public function children_video()

{

  return $this->belongsToMany($this, 'video_hierarchy', 'video_parent_id', 'video_id');

}

네,잘못 보지 않 았 습 니 다.stoMany 자신 에 게 속 할 수 있 습 니 다.
기타 관계
Eloquent 는'원 층 1 쌍 다 중 관련','다 중 관련'과'다 중 다 중 다 중 다 중 관련'이라는 다른 세 가지 용법 도 제공한다.위의 학습 을 통 해 우 리 는 Eloquent 모델 간 관계 의 기본 개념 과 사용 방법 을 파악 했다.나머지 몇 가지 자주 사용 하지 않 는 방법 은 우리 가 사용 할 때 까지 남 겨 두 었 다가 스스로 탐색 하 자.
중요 한 기술:관계 사전 불 러 오기
1 대 1 관계 에서 사용자 10 명 을 한꺼번에 조회 하고 해당 하 는 Account 를 가 져 가 야 한다 면 데이터베이스 에 1+10 개의 SQL 을 쳐 야 하 는 성능 이 매우 떨어진다 는 것 을 알 게 되 었 을 것 입 니 다.우 리 는 관계 사전 불 러 오기 의 중요 한 특성 을 사용 할 수 있 습 니 다.http://laravel-china.org/docs/eloquent#eager-loading
직접 코드 올 리 기:

$users = User::with('hasOneAccount')->take(10)->get()
이렇게 생 성 된 SQL 은 다음 과 같 습 니 다.

select * from account where id in (1, 2, 3, ... ...)
이렇게 1+10 개의 SQL 이 1+1 개 로 바 뀌 어 성능 이 크게 향상 되 었 다.

좋은 웹페이지 즐겨찾기