백엔드 개발 PHP 튜토리얼 YII 관련 검색어 분석에 대해

YII 관련 검색어 분석에 대해

Jun 15, 2018 pm 01:51 PM
yii 관련 검색어

이 글에서는 주로 YII 상관 쿼리 관련 정보를 소개합니다. 필요한 친구들은 참고하시면 됩니다

1. 다중 테이블 상관 관계 구성

AR을 사용하여 상관 쿼리를 수행하기 전에 먼저 해야 할 일 AR은 하나의 AR 클래스가 다른 AR 클래스와 어떻게 관련되어 있는지 알고 있습니다.

두 AR 클래스 간의 관계는 AR 클래스가 표현하는 데이터 테이블 간의 관계를 통해 직접적으로 연관됩니다. 데이터베이스 관점에서 테이블 A와 B 사이에는 일대다(예: tbl_user 및 tbl_post), 일대일(예: tbl_user 및 tbl_profile) 및 다대다(예: 다대다) 관계의 세 가지 유형이 있습니다. tbl_category 및 tbl_post와 같은 다대다). AR에는 네 가지 종류의 관계가 있습니다.

BELONGS_TO(속함): 테이블 A와 B 간의 관계가 일대다인 경우 테이블 B는 테이블 A에 속합니다(예: Post는 사용자에 속함).

HAS_MANY(여러 개 있음): 테이블 A와 B 사이의 관계가 일대다인 경우 A에는 여러 개의 B가 있습니다(예: 사용자에게 여러 개의 게시물이 있음).

HAS_ONE(하나 있음): HAS_MANY의 특수한 경우, A에는 최대 하나의 B가 있습니다(예: 사용자는 최대 하나의 프로필을 가집니다).

MANY_MANY: 이는 데이터베이스의 다대다 관계에 해당합니다. 대부분의 DBMS는 다대다 관계를 직접 지원하지 않기 때문에 다대다 관계를 일대다 관계로 분할하려면 관계 테이블이 필요합니다. 예제 데이터 구조에서는 tbl_post_category가 이 목적으로 사용됩니다. AR 용어로 MANY_MANY를 BELONGS_TO와 HAS_MANY의 조합으로 해석할 수 있습니다. 예를 들어 Post는 Many(belongs to Many) 카테고리에 속하고 Category는 Many(has Many)에 속합니다. Post.

AR에 정의된 관계는 CActiveRecord의 관계() 메서드를 재정의해야 합니다. 이 메서드는 관계 구성의 배열을 반환합니다. 각 배열 요소는 다음 형식으로 단일 관계를 나타냅니다.

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)
로그인 후 복사

여기서 VarName은 관계의 이름입니다. RelationType은 self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY 및 self::라는 네 가지 상수 중 하나일 수 있는 관계 유형을 지정합니다. MANY_MANY; ClassName은 이 AR 클래스가 연결된 AR 클래스의 이름입니다. ForeignKey는 관계에 사용되는 외래 키를 지정합니다.

명확해야 할 몇 가지 사항:

(1) VarName은 무엇을 참조합니까? 자세한 내용은 아래 예제 2를 참조하세요.

(2),관계 유형. 총 4가지 유형이 있습니다. 즉,

self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS_ONE입니다.

(3), 클래스 이름. 즉, 또 다른 연관된 ../model/classname.php입니다.

(4), ForeignKey. 외래 키는 누구에게 있습니까?

(5), 추가 조건

ER 다이어그램

예제 1, 일대다 및 다대일 관계(게시물과 사용자 간의 관계)

1) models/Post.php

class Post extends CActiveRecord 
{ 
...... 
public function relations() 
{ 
return array( 
'author'=>array(self::BELONGS_TO, 'User', 'author_id'), 
); 
} 
}
로그인 후 복사

게시물과 사용자 사이의 관계는 BELONGS_TO(다대일) 관계이며, 게시물의 작성자 ID를 통해 사용자와 연결됩니다.

Post의 Author_id는 외래 ​​키이며 User와 연결되어 있습니다.

참고: 여기서 VarName은 작성자, 개체입니다.

(2) models/User.php

class User extends CActiveRecord 
{ 
...... 
public function relations() 
{ 
return array( 
'posts'=>array(self::HAS_MANY, 'Post', 'author_id'), 
'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'), 
); 
} 
}
로그인 후 복사

User의 경우 Post와의 관계는 HAS_MANY(일대다) 관계입니다. 그리고 Post의 Author_id를 통해 Post와 연결됩니다.

예 2, 다대다 관계

in FailParts.php

'Users' => array(self::MANY_MANY, 'User', 'fail_parts_user(fail_parts_id, user_id)'),
로그인 후 복사

in User.php

'FailParts' => array(self::MANY_MANY, 'FailParts', 'fail_parts_user(user_id, fail_parts_id)'),
로그인 후 복사

둘은 다대다 관계이므로 , 따라서 사용자가 아닌 사용자를 사용하십시오. FailPart가 아닌 FailPart를 사용하십시오.

여기의 Users 및 FailParts는 이전 VarName입니다.

예시 3, 일대일 관계

비교적 간단하므로 일단 생략하겠습니다.

2, VarName 소개.

클래스 A.php의 경우 'VarName'=>array('RelationType', 'B', 'ForeignKey', ...추가 옵션)
여기서 VarName은 기본적으로 B와 동일합니다. 그러나 반드시 똑같지는 않습니다. 이때 A의 views/A/xx.php에 있는 VarName을 통해 B와 해당 속성값에 접근할 수 있습니다.

일대일인 경우: A->VarName
다대일인 경우:author_name = $post->Author->name;
일대다인 경우: $ Posts = $author->Post;
다대다인 경우: $posts = $author->Post;//핵심은 일대다와 다대일로 나누는 것입니다

foreach($posts as $u){ 
$_tmp_titles[] = $u -> title; 
} 
titleStr = implode(', ', $_tmp_titles);
로그인 후 복사

2. 다중 테이블 연관의 사용

자주 컨트롤러에서

1, 지연 로딩

(1) 다대일

$post = Post::model()->findByPk(10); 
$author = $post->author;
로그인 후 복사

참고: 여기서 핵심은 일대일입니다.

(2) 일대다

$user = User::model()->findByPk(10); 
$posts = $user->posts;
로그인 후 복사

(3) 다대다

중요한 점은 두 ID 사이에 순차적 관계가 있다는 것입니다.

$repairInfo 인스턴스의 관점에서 연결은

'FailParts' => array(self::MANY_MANY, 'FailParts', 'repair_mapping(repair_info_id,fail_parts_id)'),
로그인 후 복사

이어야 하며 $failParts 인스턴스의 관점에서 연결은

'RepairInfos' => array(self::MANY_MANY, 'RepairInfo', 'repair_mapping(fail_parts_id, repair_info_id)'),
로그인 후 복사

이 됩니다. 필수는 아닙니다. 양면이 모두 구성되어 있으므로 필수 면만 설정하면 됩니다.

이전에 사용되었던 어리석은 방법:

/*方法一:使用表关系(多对多)*/ 
$fails = $repairInfo->FailParts;//在$repairInfo中使用 
/*方法二:使用原始方法*/ 
$id = $repairInfo->id; 
$maps = RepairMapping::model()->findAll("repair_info_id = $id"); 
$f_ids = array(); 
foreach($maps as $map){ 
array_push($f_ids, $maps[0]->fail_parts_id); 
} 
$f_idsStr = implode(',',$f_ids); 
$fails = FailParts::model()->findAll("id IN ($f_idsStr)");
로그인 후 복사

2, 활성 로딩 - with

(1) 일대다
(2) 다대다

$posts = Post::model()->('author')->findAll();
로그인 후 복사

例子:

User.php

//查询一个机房$idc_id的所有用户 
function getAdminedUsersByIdc($idc_id){ 
$c = new CDbCriteria(); 
$c->join = "JOIN idc_user on t.id=idc_user.user_id"; 
$c->condition = "idc_user.idc_id=$idc_id"; 
return User::model()->with('Idcs')->findAll($c); 
} 
//规则中配置 
'Idcs' => array(self::MANY_MANY, 'Idc', 'idc_user(user_id, idc_id)'),
로그인 후 복사

批注:没有with('Idcs'),执行后的结果也一样。只不过不再是eager loading。

三、带参数的关联配置

常见的条件有

1,condition 按某个表的某个字段加过滤条件

例如:

//在User的model里定义,如下关联关系 
'doingOutsources' => array(self::MANY_MANY, 'Outsource', 'outsource_user(user_id, outsource_id)', 
'condition' => "doingOutsources.status_id IN(" . Status::ASSIGNED . "," . Status::STARTED ."," . Status::REJECTED .")"),
로그인 후 복사

//结论:condition是array里指定model的一个字段。

显然,doingOutsources是真实数据表Outsource的别名,所以在condition中可以使用doingOutsources.status_id,当然也可以使用Outsource.status_id。另本表名user的默认别名是t。

2,order 按某个表的某个字段升序或降序

//在RepairInfo的model里定义,如下关联关系 
'WorkSheet' => array(self::HAS_MANY, 'WorkSheet', 'repair_info_id', order => 'created_at desc'), 
//调用 
$worksheets = $repair_info->WorkSheet; //此时$worksheets是按降序排列
로그인 후 복사

//结论:order是array里指定model的一个字段。

with
joinType
select
params
on
alias
together
group
having
index

还有用于lazy loading的
limit 只取5个或10个
offset
through
官方手册
'posts'=>array(self::HAS_MANY, 'post', 'author_id', 'order'=>'posts.create_time DESC', 'with'=>'categories'),

四、静态查询(仅用于HAS_MANY和MANY_MANY)

关键字:self:STAT

1,基本用法。例如,

class Post extends CActiveRecord 
{ 
...... 

public function relations() 
{ 
return array( 
'commentCount'=>array(self::STAT, 'Comment', 'post_id'), 
'categoryCount'=>array(self::STAT,'Category','post_category(post_id, category_id)'); 

); 
} 
}
로그인 후 복사

2,静态查询也支持上面的各种条件查询

'doingOutsourceCount' => array(self::STAT, 'Outsource', 'outsource_user(user_id, outsource_id)', 
'condition' => "outsource.status_id IN(" . Status::ASSIGNED . "," . Status::STARTED ."," . Status::REJECTED .")"),
로그인 후 복사

其他查询还包括

condition 使用较多

order
select
defaultValue
params
group
having

3,静态查询的加载方式

可以使用lazy loading方式
$post->commentCount.
也可以使用eager loading方式
$posts = Post::model()->with('commentCount','categoryCount')->findAll();
注with中字符串一定是别名。

两者的性能比较:

如果需要取所有post的所有comment,前者需要2N+1次查询,而后者只有一次。两者的选择视情况而定。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Yii中表单用法实例

Yii2如何实现同时搜索多个字段

如何实现Yii2框架中使用PHPExcel导出Excel文件

위 내용은 YII 관련 검색어 분석에 대해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MyBatis 일대다 쿼리 구성에 대한 자세한 설명: 일반적인 관련 쿼리 문제 해결 MyBatis 일대다 쿼리 구성에 대한 자세한 설명: 일반적인 관련 쿼리 문제 해결 Feb 22, 2024 pm 02:18 PM

MyBatis 일대다 쿼리 구성에 대한 자세한 설명: 일반적인 관련 쿼리 문제를 해결하려면 특정 코드 예제가 필요합니다. 실제 개발 작업에서는 마스터 엔터티 개체와 관련 여러 슬레이브 엔터티 개체를 쿼리해야 하는 상황에 자주 직면합니다. . MyBatis에서 일대다 쿼리는 일반적인 데이터베이스 연결 쿼리로, 올바른 구성을 사용하면 관련 개체의 쿼리, 표시 및 작업을 쉽게 구현할 수 있습니다. 이 기사에서는 MyBatis의 일대다 쿼리 구성 방법과 몇 가지 일반적인 관련 쿼리 문제를 해결하는 방법을 소개합니다.

PHP 프레임워크 Yii를 사용하여 고가용성 클라우드 백업 시스템을 개발하는 방법 PHP 프레임워크 Yii를 사용하여 고가용성 클라우드 백업 시스템을 개발하는 방법 Jun 27, 2023 am 09:04 AM

클라우드 컴퓨팅 기술이 지속적으로 발전하면서 데이터 백업은 모든 기업이 반드시 해야 할 일이 되었습니다. 이러한 맥락에서 가용성이 높은 클라우드 백업 시스템을 개발하는 것이 특히 중요합니다. PHP 프레임워크 Yii는 개발자가 고성능 웹 애플리케이션을 빠르게 구축하는 데 도움이 되는 강력한 프레임워크입니다. 다음은 Yii 프레임워크를 사용하여 고가용성 클라우드 백업 시스템을 개발하는 방법을 소개합니다. 데이터베이스 모델 설계 Yii 프레임워크에서 데이터베이스 모델은 매우 중요한 부분입니다. 데이터 백업 시스템에는 많은 테이블과 관계가 필요하기 때문에

PHP의 다중 테이블 관련 쿼리 기술 PHP의 다중 테이블 관련 쿼리 기술 May 24, 2023 am 10:01 AM

PHP의 다중 테이블 관련 쿼리 기술 관련 쿼리는 특히 여러 관련 데이터베이스 테이블에 데이터를 표시해야 하는 경우 데이터베이스 쿼리의 중요한 부분입니다. PHP 애플리케이션에서는 MySQL과 같은 데이터베이스를 사용할 때 다중 테이블 관련 쿼리를 자주 사용합니다. 다중 테이블 연관의 의미는 한 테이블의 데이터를 다른 테이블 또는 여러 테이블의 데이터와 비교하고 결과에서 요구 사항을 충족하는 행을 연결하는 것입니다. 다중 테이블 상관 쿼리를 수행할 때는 테이블 간의 관계를 고려하고 적절한 상관 방법을 사용해야 합니다. 다음은 여러 유형의

Symfony vs Yii2: 대규모 웹 애플리케이션 개발에 어떤 프레임워크가 더 좋나요? Symfony vs Yii2: 대규모 웹 애플리케이션 개발에 어떤 프레임워크가 더 좋나요? Jun 19, 2023 am 10:57 AM

웹 애플리케이션에 대한 수요가 계속 증가함에 따라 개발자는 개발 프레임워크를 선택할 때 점점 더 많은 선택권을 갖게 되었습니다. Symfony와 Yii2는 두 가지 인기 있는 PHP 프레임워크입니다. 둘 다 강력한 기능과 성능을 갖추고 있지만 대규모 웹 애플리케이션을 개발해야 하는 경우 어떤 프레임워크가 더 적합합니까? 다음으로 더 나은 선택을 하실 수 있도록 Symphony와 Yii2의 비교 분석을 진행하겠습니다. 기본 개요 Symphony는 PHP로 작성된 오픈 소스 웹 애플리케이션 프레임워크이며 다음을 기반으로 합니다.

PHP에서 Yii3 프레임워크를 사용하는 방법은 무엇입니까? PHP에서 Yii3 프레임워크를 사용하는 방법은 무엇입니까? May 31, 2023 pm 10:42 PM

인터넷이 계속 발전함에 따라 웹 애플리케이션 개발에 대한 수요도 점점 높아지고 있습니다. 개발자의 경우 애플리케이션 개발에는 개발 효율성을 향상시킬 수 있는 안정적이고 효율적이며 강력한 프레임워크가 필요합니다. Yii는 풍부한 기능과 우수한 성능을 제공하는 선도적인 고성능 PHP 프레임워크입니다. Yii3은 Yii2를 기반으로 성능과 코드 품질을 더욱 최적화하는 Yii 프레임워크의 차세대 버전입니다. 이번 글에서는 Yii3 프레임워크를 사용하여 PHP 애플리케이션을 개발하는 방법을 소개하겠습니다.

Yii 프레임워크의 데이터 쿼리: 데이터에 효율적으로 액세스 Yii 프레임워크의 데이터 쿼리: 데이터에 효율적으로 액세스 Jun 21, 2023 am 11:22 AM

Yii 프레임워크는 웹 애플리케이션 개발 프로세스를 단순화하기 위한 다양한 도구와 구성 요소를 제공하는 오픈 소스 PHP 웹 애플리케이션 프레임워크입니다. 데이터 쿼리는 중요한 구성 요소 중 하나입니다. Yii 프레임워크에서는 SQL과 유사한 구문을 사용하여 데이터베이스에 액세스하여 데이터를 효율적으로 쿼리하고 조작할 수 있습니다. Yii 프레임워크의 쿼리 빌더에는 주로 ActiveRecord 쿼리, QueryBuilder 쿼리, 명령 쿼리 및 원본 SQL 쿼리 유형이 포함됩니다.

Yii2 vs Phalcon: 그래픽 렌더링 애플리케이션 개발에 어떤 프레임워크가 더 좋나요? Yii2 vs Phalcon: 그래픽 렌더링 애플리케이션 개발에 어떤 프레임워크가 더 좋나요? Jun 19, 2023 am 08:09 AM

현재 정보화 시대에는 빅데이터, 인공지능, 클라우드 컴퓨팅 등의 기술이 주요 기업의 화두가 되었습니다. 이러한 기술들 중에서 고성능 그래픽 처리 기술로서 그래픽 카드 렌더링 기술이 점점 주목을 받고 있다. 그래픽 카드 렌더링 기술은 게임 개발, 영화 및 TV 특수 효과, 엔지니어링 모델링 및 기타 분야에서 널리 사용됩니다. 개발자에게 자신의 프로젝트에 적합한 프레임워크를 선택하는 것은 매우 중요한 결정입니다. 현재 언어 중에서 PHP는 Yii2, Ph와 같은 뛰어난 PHP 프레임워크 중 매우 역동적인 언어입니다.

Golang에서 조인 쿼리를 사용하여 테이블을 조인하는 방법은 무엇입니까? Golang에서 조인 쿼리를 사용하여 테이블을 조인하는 방법은 무엇입니까? Jun 05, 2024 am 11:10 AM

상관 쿼리는 테이블을 조인하여 SQL 쿼리를 통해 여러 테이블의 데이터를 결합합니다. Golang에서는 sql.DB.Query() 함수를 사용하여 쿼리 문자열과 매개변수를 지정합니다. 원하는 결과 집합에 따라 INNERJOIN, LEFTJOIN, RIGHTJOIN, FULLOUTERJOIN 등 다양한 조인 유형을 사용할 수 있습니다.

See all articles