>  기사  >  백엔드 개발  >  Yii2.0 테이블 연관 쿼리 분석

Yii2.0 테이블 연관 쿼리 분석

不言
不言원래의
2018-06-15 14:36:062581검색

이 글은 주로 Yii2.0의 테이블 상관 쿼리 방법을 소개하고, Yii의 상관 쿼리 구현 방법과 관련 활용 기술을 예시 형태로 분석해 도움이 필요한 친구들이 참고할 수 있습니다

본 글의 예시는 다음과 같습니다. Yii2.0 쿼리 방법에서 테이블 상관 관계를 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

ActiveRecord를 사용하여 관련 쿼리를 수행하고(예: 테이블 A에서 데이터를 읽을 때 테이블 B의 관련 데이터를 함께 읽음) Active Record 기본 테이블 ActiveRecord 개체의 속성에 액세스하는 것만큼 간단할 수 있습니다.

예를 들어 적절한 관계 선언을 사용하면 $customer->orders를 사용하여 이 고객이 주문한 주문을 나타내는 Order 개체 배열을 얻을 수 있습니다.

관계를 선언하려면 조건을 충족하는 관련 데이터만 쿼리되도록 관련 컨텍스트 정보와 함께 yiidbActiveQuery 개체를 반환하는 getter 메서드를 정의하세요. 예:

class Customer extends \yii\db\ActiveRecord
{
 public function getOrders()
 {
  // Customer has_many Order via Order.customer_id -> id
  return $this->hasMany(Order::className(), ['customer_id' => 'id']);
 }
}
class Order extends \yii\db\ActiveRecord
{
 // Order has_one Customer via Customer.id -> customer_id
 public function getCustomer()
 {
  return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
 }
}

위 코드의 yiidbActiveRecord::hasMany() 및 yiidbActiveRecord::hasOne()은 관계형 데이터베이스에서 일대다 및 일대일 관계를 모델링하는 데 사용됩니다. 예를 들어 고객이 여러 주문을 갖고 있고 주문이 한 명의 사용자를 소유하거나 속합니다. 두 메소드 모두 두 개의 매개변수를 수신하고 yiidbActiveQuery 객체를 반환합니다.

$class: 연관된 모델의 클래스 이름.

$link: 두 테이블 사이의 열 연결. 이는 배열이어야 합니다. 배열 요소의 키는 $class에 해당하는 테이블의 컬럼 이름이고, 배열 요소의 값은 현재 선언된 클래스의 컬럼 이름이다. 테이블 외래 키 연관 측면에서 이러한 관계를 정의하는 것은 좋은 프로그래밍 습관입니다.

위 명령문을 완료한 후 해당 getter 메소드를 정의하여 객체 속성에 액세스하는 것처럼 관련 데이터를 가져올 수 있습니다.

// get the orders of a customer
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders is an array of Order objects

위 코드는 실제로 위 두 줄에 해당하는 다음 두 SQL 쿼리를 백그라운드에서 실행합니다. code:

SELECT * FROM customer WHERE id=1;
SELECT * FROM order WHERE customer_id=1;

팁: $customer->orders에 다시 액세스하면 위 2번째 줄의 SQL 쿼리가 반복적으로 실행되지 않습니다. 이 쿼리 문은 표현식에 처음 액세스할 때만 실행됩니다. 후속 액세스는 내부 버퍼링된 데이터를 직접 반환합니다. 쿼리를 다시 실행하려면 먼저 unset을 호출하여 캐시를 지우세요.

unset($customer->orders);.

때로는 쿼리 조건을 제한하기 위해 관련 쿼리에 매개변수를 전달해야 할 수도 있습니다. 예를 들어 모든 주문이 아닌 지정된 금액을 초과하는 대량 주문만 읽으려는 경우입니다. 이를 위해 다음 getter 메소드를 사용하여 bigOrders 관계를 선언할 수 있습니다.

class Customer extends \yii\db\ActiveRecord
{
 public function getBigOrders($threshold = 100)
 {
  return $this->hasMany(Order::className(), ['customer_id' => 'id'])
   ->where('subtotal > :threshold', [':threshold' => $threshold])
   ->orderBy('id');
 }
}

기억하세요 hasMany() 반환된 객체는 yiidbActiveQuery이므로 ActiveQuery 메소드를 사용하여 이 관련 쿼리를 사용자 정의할 수 있습니다.

위 명령문을 사용하여 $customer->bigOrders에 액세스하면 금액이 100보다 큰 주문만 반환됩니다. 다른 제한 값을 지정하려면 다음 코드를 사용하세요.

$orders = $customer->getBigOrders(200)->all();

참고: 연결된 메서드는 yiidbActiveQuery 인스턴스를 반환합니다. 속성(클래스 속성)으로 액세스하는 경우 반환되는 데이터는 yiidbActiveRecord 인스턴스, ActiveRecord 배열 또는 null입니다. 예를 들어 $customer->getOrders()는 ActiveQuery 인스턴스를 반환하는 반면 $customer->orders는 Order 개체의 배열(또는 쿼리 결과가 비어 있는 경우 빈 배열)을 반환합니다.

중간 테이블 관련 쿼리

때때로 일부 데이터 테이블이 중간 테이블(피벗 테이블)을 통해 관련되어 있는 경우가 있습니다. 이러한 관계를 선언하기 위해 via() 또는 viaTable() 메소드를 호출하여 yiidbActiveQuery 객체를 사용자 정의할 수 있습니다.

예를 들어 주문 테이블 order와 product 테이블 item이 연결 테이블 order_item을 통해 관련되어 있는 경우 Order 클래스에서 다음과 같이 항목 관계를 선언할 수 있습니다.

class Order extends \yii\db\ActiveRecord
{
 public function getItems()
 {
  return $this->hasMany(Item::className(), ['id' => 'item_id'])
   ->viaTable('order_item', ['order_id' => 'id']);
 }
}

via() 메서드는 viaTable()과 유사합니다. , 그러나 첫 번째 매개변수는 중간 테이블의 이름이 아닌 ActiveRecord 클래스에 선언된 현재 A 관계 이름에 있습니다. 예를 들어, 위의 항목 관계는 다음 메소드로 선언할 수도 있습니다.

class Order extends \yii\db\ActiveRecord
{
 public function getOrderItems()
 {
  return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
 }
 public function getItems()
 {
  return $this->hasMany(Item::className(), ['id' => 'item_id'])
   ->via('orderItems');
 }
}

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 중국사이트!

관련 추천:

Yii의 양식 사용 예

YII 관련 검색어 분석 정보

위 내용은 Yii2.0 테이블 연관 쿼리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.