예 를 들 어 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();
이렇게 하면 기본적으로 전체 관련 부분 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기