예 를 들 어 YII 2 의 다 중 표 와 관련 된 사용 방법 을 설명 하 다
본 고 는 YII 2.0 의 다 중 표 관련 조회 에 대해 간단 한 소 개 를 한다.글 에서 인 스 턴 스 코드 를 통 해 매우 상세 하 게 소개 되 었 습 니 다.다음은 더 이상 말 하지 않 고 상세 한 소 개 를 보 겠 습 니 다.
일단 표 구 조 를 설명해 드릴 게 요.
표 구조
현재 주문서,사용자 표,상품 명세서,상품 재고 표 가 있 습 니 다.
YII 에서 다른 테이블 과 직접 연결 하여 조회 하려 면 먼저 모델 에서 그들의 연결 을 정의 해 야 한다
Order
class Order extends \yii\db\ActiveRecord.{
// get+
//
public function getUser(){
// ,
// user_id, usesr_id
// User.user_id => Order.user_id
return $this->hasMany(User::className(), ['user_id' => 'user_id']);
}
}
1.hasMany,hasOne 사용Yii 2 의 표 간 의 관 계 는 두 가지 로 두 모델 간 의 관 계 를 지정 합 니 다.
●1 대 다:hasMany●1 대 1:hasOne
●결과 반환:이 두 가지 방법의 반환 결 과 는 모두 yiidbActiveQuery 대상(마지막 으로 표준 배열 형식 으로 돌아 가 려 면 asArray()인 자 를 추가 하 는 것 을 기억 하 세 요)
●첫 번 째 매개 변수:관련 모델 의 클래스 이름.
●두 번 째 매개 변수:하나의 배열 입 니 다.그 중에서 키 는 관련 모델 의 속성 이 고 값 은 현재 모델 의 속성 입 니 다.
관련 사용
이제 주문 서 를 받 아 보 겠 습 니 다.
//
$order = Order::findOne(1);
//
$user = $order->user;
물론 with 방법 을 선택 할 수 있 습 니 다.이렇게 하면 간결 해 보일 수 있 습 니 다.그 중에서 with 의 매개 변 수 는 관계 의 이름 이 고 model 에서 정 의 된 getUser 중의 user 입 니 다.
// ( )
$order = Order::find(1)->with('user');
//
$order = Order::find(1)->getUser();
위의 코드 는 다음 과 같은 sql 문 구 를 생 성하 고 실행 합 니 다.
SELECT * FROM order WHERE id=1;
SELECT * FROM user WHERE user.user_id=order.user_id;
위 에서 보 듯 이 하나의 연관 성 을 방문 할 때 두 가지 방법 이 있 습 니 다.●함수 로 호출 하면 ActiveQuery 대상($customer->getOrders()->all())을 되 돌려 줍 니 다.
●속성 으로 호출 하면 모델 의 결 과 를 되 돌려 줍 니 다($customer->orders)
관련 결과 캐 시
만약 이때 order 표 가 바 뀌 었 다 면,우 리 는 다시 조회 하 기 를 희망 합 니 다.
$user = $order->user;
다시 주문 서 를 받 았 을 때 변 함 이 없다 는 것 을 알 게 될 것 이다.$order->user 를 처음 실행 할 때 만 데이터베이스 에 가서 조회 한 다음 결 과 를 캐 시 합 니 다.나중에 조회 할 때 sql 을 실행 하지 않 기 때 문 입 니 다.그럼 sql 을 다시 실행 하고 싶다 면 어떻게 하 시 겠 습 니까?실행 가능
//
unset($order->user);
$order->user;
크로스 테이블 조회다음은 포인트!위 표 구조의 그림 을 통 해 알 수 있 듯 이 User 표 와 Ordergoods 는 직접적인 관련 이 없다 고 밝 혔 습 니 다.사용자 정보 에 따라 이 사용자 가 어떤 상품 을 샀 는 지 찾 으 려 면 Order 표를 통 해 두 장의 표를 연결 해 야 합 니 다.그럼 어떻게 해 야 되 지?우선 모델 층.저 희 는 사용자 에 따라 검색 하기 때문에 User 의 model 층 에 가서 관 계 를 정의 합 니 다.
User
public function getOrder() {
return $this->hasMany(Order::className(), ['user_id' => 'user_id']);
}
public function getOrderGoods() {
return $this->hasMany(OrderGoods::className(), ['order_id' => 'order_id'])->
via('order');
}
여기 주의:getOrder Goods 의 두 번 째 orderid 는 getOrder 와 연 결 된 Order 의 order 를 말 합 니 다.id,첫 번 째 orderid 는 Order Goods 의 order 를 말 합 니 다.id。하지만!우 리 는 SQL 문 구 를 사용 하 는 가장 쉬 운 방법 이 있 습 니 다!
$map = 'select
user.name,
order.id,
order_goods.goods_id,
goods.goods_name,
stock.stock_count
from user
LEFT JOIN order ON order.user_id = user.user_id
LEFT JOIN order_goods ON order_goods.order_id = order.order_id
LEFT JOIN goods ON goods.goods_id = order_goods.goods_id
LEFT JOIN stock ON stock.goods_id = goods.goods_id';
$list1 = Article::findBySql($map)->asArray()->all();
이렇게 하면 기본적으로 전체 관련 부분 입 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Yii2.0 rules 검증 규칙 집합required: 필수 값 검증 속성 이메일: 메일박스 인증 match: 정규 검증 URL: 사이트 주소 captcha: 인증 코드 안전 비교: 비교 default: 기본값 exist:존재 파일:파일 filter:필...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.