테이블 구조
이제 고객 테이블, 주문 테이블, 도서 테이블, 저자 테이블,
고객 테이블 Customer(id customer_name)
주문 테이블 Order(id order_name customer_id book_id)가 있습니다. )
도서 테이블(id book_nameauthor_id)
저자 테이블(idauthor_name)
모델 정의
다음은 이 네 가지 모델의 정의이며, 이들 간의 관계만 나타냅니다. 작성
고객
class Customer extends \yii\db\ActiveRecord { // 这是获取客户的订单,由上面我们知道这个是一对多的关联,一个客户有多个订单 public function getOrders() { // 第一个参数为要关联的子表模型类名, // 第二个参数指定 通过子表的customer_id,关联主表的id字段 return $this->hasMany(Order::className(), ['customer_id' => 'id']); } }
주문
class Order extends \yii\db\ActiveRecord { // 获取订单所属用户 public function getCustomer() { //同样第一个参数指定关联的子表模型类名 // return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } // 获取订单中所有图书 public function getBooks() { //同样第一个参数指定关联的子表模型类名 // return $this->hasMany(Book::className(), ['id' => 'book_id']); } }
책
class Book extends \yii\db\ActiveRecord { // 获取图书的作者 public function getAuthor() { //同样第一个参数指定关联的子表模型类名 return $this->hasOne(Author::className(), ['id' => 'author_id']); } }
저자
class Autor extends \yii\db\ActiveRecord { }
hasMany 및 hasOne 사용
Yii2의 테이블 간 연관에는 두 가지 유형이 있으며, 이는 두 모델 간의 연관을 지정하는 데 사용됩니다.
일대다: hasMany
일대일: hasOne
반환 결과: 이 두 메소드의 반환 결과는 yiidbActiveQuery입니다. 객체
첫 번째 매개변수: 연관된 모델의 클래스 이름.
두 번째 매개변수: 배열입니다. 여기서 키는 관련 모델의 속성이고 값은 현재 모델의 속성입니다.
연관 사용법
이제 고객의 모든 주문 정보를 가져옵니다
// 获取一个客户信息 $customer = Customer::findOne(1); $orders = $customer->orders; // 通过在Customer中定义的关联方法(getOrders())来获取这个客户的所有的订单。
위 두 줄의 코드는 다음 SQL 문을 생성합니다.
SELECT * FROM customer WHERE id=1; SELECT * FROM order WHERE customer_id=1;
연관 결과 캐시
고객의 주문이 변경되면 다시 전화드립니다
$orders = $customer->orders;
다시 주문하세요. 변경 사항이 없습니다. 그 이유는 $customer->orders가 처음 실행될 때만 데이터베이스를 쿼리하고 결과를 캐시하며 이후 쿼리에서는 sql이 실행되지 않기 때문입니다.
그럼 다시 sql을 실행하고 싶다면 어떻게 해야 할까요?
unset($customer->orders); $customer->orders;
를 실행하면 데이터베이스에서 데이터를 검색할 수 있습니다.
여러 연결 정의
마찬가지로 Customer에서 여러 연결을 정의할 수도 있습니다.
반환된 총 주문 수가 100개를 초과하는 경우.
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'); } }
와 관련된 두 가지 액세스 방법은 위와 같습니다.
$customer->bigOrders
를 사용하는 경우 100보다 큰 모든 주문 얻을 것이다. 200개가 넘는 주문을 반품하려면
$orders = $customer->getBigOrders(200)->all();
와 같이 입력하면 됩니다. 위에서 볼 수 있듯이 협회에 액세스하는 방법은 두 가지가 있습니다
함수를 메소드에서 호출하면 ActiveQuery 객체($customer->getOrders()->all())가 반환됩니다.
속성 메소드를 사용하면 모델의 결과가 직접 반환됩니다($customer- >orders)
고객의 주문을 받는 with를 사용하려면 다음 코드를 참조하세요.
// 执行sql语句: SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); //执行sql:SELECT * FROM order WHERE customer_id=1 $orders1 = $customer->orders; //这个不会执行sql,直接使用上面的缓存结果 $orders2 = $customer->orders;
이제 100명의 사용자를 빼고 각 사용자에게 접근하고 싶다면 위의 이해에서 다음과 같은 코드를 작성할 수 있습니다.
// 执行sql语句: SELECT * FROM customer LIMIT 100 $customers = Customer::find()->limit(100)->all(); foreach ($customers as $customer) { // 执行sql: SELECT * FROM order WHERE customer_id=... $orders = $customer->orders; // 处理订单。。。 }
그러나 정말로 원한다면 이렇게 작성하면 foreach의 각 루프에서 SQL이 한 번씩 실행되어 내부 데이터베이스로 이동합니다. 각 $customer 개체가 다르기 때문입니다.
위 문제를 해결하기 위해 yiidbActiveQuery::with()를 사용할 수 있습니다.
너비 매개변수는 관계의 이름입니다. 즉, 모델에 정의된 getOrders, getCustomer의 주문 및 고객
// 先执行sql: SELECT * FROM customer LIMIT 100; // SELECT * FROM orders WHERE customer_id IN (1,2,...) $customers = Customer::find()->limit(100) ->with('orders')->all(); foreach ($customers as $customer) { // 在这个循环的时候就不会再执行sql了 $orders = $customer->orders; // ...handle $orders... }
select를 사용하여 열을 반환하려면 반환된 열에 연결된 모델의 연결된 필드가 포함되어 있는지 확인하세요. 그렇지 않으면
연결된 테이블의 모델$orders = Order::find()->select(['id', 'amount'])->with('customer')->all(); // $orders[0]->customer 的结果将会是null // 因为上面的select中没有返回所关联的模型(customer)中的指定的关联字段。 // 如果加上customer_id,$orders[0]->customer就可以返回正确的结果 $orders = Order::find()->select(['id', 'amount', 'customer_id'])->with('customer')->all();가 반환되지 않습니다 with에 필터 조건 추가
100명이 넘는 고객의 주문을 조회
//首先执行sql: SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); // 再执行查询订单的sql语句:SELECT * FROM order WHERE customer_id=1 AND subtotal>100 $orders = $customer->getOrders()->where('subtotal>100')->all();100명의 고객의 주문을 조회하고, 각 고객의 합계가 100
// 下面的代码会执行sql语句: // SELECT * FROM customer LIMIT 100 // SELECT * FROM order WHERE customer_id IN (1,2,...) AND subtotal>100 $customers = Customer::find()->limit(100)->with([ 'orders' => function($query) { $query->andWhere('subtotal>100'); }, ])->all();를 초과합니다 여기서 너비 매개변수는 배열이고 키는 관련 이름이며 값은 콜백 함수입니다. 즉, 주문 연결에서 반환된 ActiveQuery에 대해 $query->andWhere('subtotal>100');테이블 연결에 JoinWith 사용우리 모두는 Join On을 사용하여 여러 테이블 간의 연결을 작성할 수 있다는 것을 알고 있습니다. 먼저 yii2
joinWith( $with, $eagerLoading = true, $joinType = 'LEFT JOIN' )$with에서 JoinWit 선언을 살펴보세요. 데이터 유형은 문자열 또는 배열이며, 문자열인 경우 모델에 정의된 연관 이름입니다. (하위 협회일 수 있음). 배열인 경우 키는 모델에서 getXXX 형식으로 정의된 연결이고 값은 이 연결에 대한 추가 콜백 작업입니다.
// 订单表和客户表以Left join的方式关联。 // 查找所有订单,并以客户 ID 和订单 ID 排序 $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all(); // 订单表和客户表以Inner join的方式关联 // 查找所有的订单和书 $orders = Order::find()->innerJoinWith('books')->all(); // 使用inner join 连接order中的 books关联和customer关联。 // 并对custmer关联再次进行回调过滤:找出24小时内注册客户包含书籍的订单 $orders = Order::find()->innerJoinWith([ 'books', 'customer' => function ($query) { $query->where('customer.created_at > ' . (time() - 24 * 3600)); } ])->all(); // 使用left join连接 books关联,books关联再用left join 连接 author关联 $orders = Order::find()->joinWith('books.author')->all();구현 시 Yii는 먼저 JOIN 쿼리를 실행합니다. SQL 문을 만족하는 조건을 입력하고 그 결과를 메인 모델에 채운 후 각 연관에 대한 질의문을 실행하고 해당 연관 모델을 채운다.
// Order和books关联 inner join ,但不获取books关联对应的数据 $orders = Order::find()->innerJoinWith('books', false)->all();On 조건연관 정의 시 on 조건을 지정할 수도 있습니다.
class User extends ActiveRecord { public function getBooks() { return $this->hasMany(Item::className(), ['owner_id' => 'id'])->onCondition(['category_id' => 1]); } }joinWith에 사용
//先查询主模型(User)的数据, SELECT user.* FROM user LEFT JOIN item ON item.owner_id=user.id AND category_id=1 // 然后再根据关联条件查询相关模型数据SELECT * FROM item WHERE owner_id IN (...) AND category_id=1 // 这两个在查询的过程中都使用了 on条件。 $users = User::find()->joinWith('books')->all();조인 연산을 사용하지 않는 경우 속성과 함께 사용하거나 직접 연결에 액세스하더라도 마찬가지입니다. 이때 where 조건은 on 조건을 사용하게 됩니다.
// SELECT * FROM user WHERE id=10 $user = User::findOne(10);요약먼저 모델에서 연관을 정의해야 합니다(예: getOrders의 Orders는 연관입니다) 그런 다음 with 또는 JoinWith 모델에 정의된 연관을 사용하십시오. Association을 사용할 때 콜백 방식을 지정할 수도 있습니다.
가장 기본적인 조작은 대충 이렇습니다. 그 밖에 더 알고 싶은 내용이 있으시면 게시글에 회신해 주시기 바랍니다.
위 내용은 편집자가 소개한 Yii2의 다중 테이블 관련 쿼리(join, Joinwith)에 대한 관련 지식입니다. 궁금한 사항이 있으면 메시지와 편집자에게 남겨주세요. 시간 내에 답변해 드리겠습니다. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!
Yii2의 다중 테이블 연관 쿼리와 조인 및 조인 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
