Yii 프레임워크는 웹 애플리케이션 개발 프로세스를 단순화하기 위한 다양한 도구와 구성 요소를 제공하는 오픈 소스 PHP 웹 애플리케이션 프레임워크이며, 그 중 데이터 쿼리는 중요한 구성 요소 중 하나입니다. Yii 프레임워크에서는 SQL과 유사한 구문을 사용하여 데이터베이스에 액세스하여 데이터를 효율적으로 쿼리하고 조작할 수 있습니다.
Yii 프레임워크의 쿼리 빌더에는 주로 활성 레코드 쿼리, 쿼리 빌더 쿼리, 명령 쿼리 및 원본 SQL 쿼리 유형이 포함됩니다. 이 문서에서는 초보자가 Yii 프레임워크에서 데이터 쿼리를 사용하는 방법을 더 잘 익힐 수 있도록 이러한 쿼리 빌더와 이를 사용하는 방법을 하나씩 소개합니다.
Active Record 모드는 Yii 프레임워크에서 가장 일반적으로 사용되는 데이터 액세스 모드 중 하나입니다. 객체 지향 인스턴스를 운영하는 것처럼 데이터베이스의 데이터를 운영할 수 있는 객체 지향 인터페이스를 제공합니다. . Yii 프레임워크에서 각 Active Record 클래스는 데이터베이스 테이블에 해당하며 클래스의 정적 메서드를 호출하여 테이블의 데이터에 액세스할 수 있습니다.
다음은 Active Record 쿼리의 예입니다.
//创建一个Active Record对象 $post = Post::findOne(1); //输出该对象的属性 echo $post->title;
이 예에서는 먼저 findOne()
메서드를 사용하여 Post
클래스의 인스턴스를 생성합니다. 이 메소드는 데이터베이스의 Post
테이블에 있는 기본 키 1을 사용하여 레코드를 쿼리하고 Active Record 개체를 반환한 다음 개체의 title
속성을 사용합니다. 레코드의 제목 속성에 액세스합니다. findOne()
方法创建了一个Post
类的实例,这个方法会查询数据库中Post
表中主键为1的记录并返回一个Active Record对象;然后我们使用该对象的title
属性来访问该记录的标题属性。
在实际开发中,我们通常需要对数据进行过滤、排序、分页等操作。Yii框架提供了丰富的方法来实现这些功能。例如,我们可以使用where()
方法来添加过滤条件,使用orderBy()
方法来指定排序方式,使用limit()
方法来限制返回的记录数,使用offset()
方法来指定返回记录的起始位置。以下是一个例子:
//查询标题包含“Yii”并且作者为“admin”的文章,并按照发布时间倒序排序,返回前10条记录 $posts = Post::find()->where(['like', 'title', 'Yii']) ->andWhere(['author' => 'admin']) ->orderBy(['created_at' => SORT_DESC]) ->limit(10) ->offset(0) ->all();
这个例子中,我们使用了find()
方法创建了一个Active Record查询对象,然后使用where()
和andWhere()
方法添加了两个过滤条件,分别是标题包含“Yii”和作者为“admin”;使用orderBy()
方法指定了按照发布时间倒序排序;使用limit()
方法限制了返回的记录数为10条;使用offset()
方法指定返回记录的起始位置为0条记录。最后,我们使用all()
方法执行查询,并返回所有符合要求的记录。
Query Builder是Yii框架中另一个常用的数据访问方式,它提供了一种链式调用的方式来构建SQL查询语句,比较适合于复杂的查询需求。在Yii框架中,我们可以使用Yii::$app->db->createCommand()
方法创建一个Query Builder对象,然后使用该对象的一系列方法来构建查询语句。
以下是一个Query Builder查询的例子:
//创建一个查询构建器对象,并构建查询语句 $query = Yii::$app->db->createCommand() ->select('id, title, content') ->from('post') ->where(['like', 'title', 'Yii']) ->andWhere(['author' => 'admin']) ->orderBy(['created_at' => SORT_DESC]) ->limit(10) ->offset(0); //执行查询,并返回结果集 $posts = $query->queryAll();
这个例子中,我们首先使用Yii::$app->db->createCommand()
方法创建了一个Query Builder对象,然后使用该对象的select()
、from()
、where()
、andWhere()
、orderBy()
、limit()
和offset()
等方法来构建查询语句。最后,我们使用queryAll()
方法执行查询,并返回所有符合要求的记录。
Query Builder与Active Record最大的区别在于,Query Builder不需要定义模型类,因此适用于一些简单的查询场景,如统计类查询。
命令查询是Yii框架中最原始的数据访问方式,我们可以使用该方式来执行一些不需要返回结果集的数据库操作,如更新、删除、插入等。在Yii框架中,我们可以使用Yii::$app->db->createCommand()
方法创建一个Command对象,然后使用该对象的execute()
方法来执行SQL语句。
以下是一个命令查询的例子:
//创建一个命令对象,并执行SQL语句 Yii::$app->db->createCommand() ->update('post', ['status' => 1], 'author = "admin"') ->execute();
这个例子中,我们首先使用Yii::$app->db->createCommand()
方法创建了一个Command对象,然后使用该对象的update()
方法构建了一条更新语句,该语句将post
表中所有author
为“admin”的记录的状态属性更新为1;最后,我们使用execute()
方法执行该更新语句。
在一些特殊情况下,我们可能需要执行一些复杂的查询语句,无法通过Active Record、Query Builder或命令查询来处理,这时可以使用原始SQL查询。在Yii框架中,我们可以使用Yii::$app->db->createCommand()
方法创建一个Command对象,然后使用该对象的setSql()
方法来指定原始的SQL语句,并使用queryAll()
where()
메서드를 사용하여 필터 조건을 추가하고, orderBy()
메서드를 사용하여 정렬 방법을 지정하고, limit() 메서드 반환되는 레코드 수를 제한하려면 <code>offset()
메서드를 사용하여 반환되는 레코드의 시작 위치를 지정합니다. 다음은 예시입니다. //创建一个命令对象,并执行原始SQL查询 $connection = Yii::$app->db; $command = $connection->createCommand(" SELECT p.id, p.title, u.username FROM post p LEFT JOIN user u ON p.author_id = u.id WHERE p.status = 1 AND u.role = 'admin' ORDER BY p.created_at DESC LIMIT 10 OFFSET 0 "); $posts = $command->queryAll();이 예시에서는
find()
메서드를 사용하여 Active Record 쿼리 객체를 생성한 다음 where()
및 andWhere() 메소드는 제목에 "Yii"가 포함되고 작성자가 "admin"이라는 두 가지 필터 조건을 추가합니다. orderBy()
메소드는 정렬을 지정하는 데 사용됩니다. 릴리스 시간의 역순을 사용합니다. limit()
메서드는 반환된 레코드 수를 10으로 제한합니다. 반환된 레코드의 시작 위치를 지정하려면 offset()
메서드를 사용하세요. 기록은 0 기록입니다. 마지막으로 all()
메서드를 사용하여 쿼리를 실행하고 요구 사항을 충족하는 모든 레코드를 반환합니다. 🎜Yii::$app->db->createCommand()
메서드를 사용하여 Query Builder 개체를 생성한 다음 해당 개체의 일련의 메서드를 사용하여 다음을 수행할 수 있습니다. 쿼리 문을 작성합니다. 🎜🎜다음은 쿼리 작성기 쿼리의 예입니다. 🎜rrreee🎜이 예에서는 먼저 Yii::$app->db->createCommand()
를 사용하여 쿼리 작성기 개체를 만듭니다. > 메서드를 선택한 다음 개체의 select()
, from()
, where()
, andWhere()
를 사용합니다. >, orderBy()
, limit()
및 offset()
과 같은 메서드는 쿼리 문을 구성하는 데 사용됩니다. 마지막으로 queryAll()
메서드를 사용하여 쿼리를 실행하고 요구 사항을 충족하는 모든 레코드를 반환합니다. 🎜🎜쿼리 빌더와 액티브 레코드의 가장 큰 차이점은 쿼리 빌더는 모델 클래스를 정의할 필요가 없기 때문에 통계 쿼리와 같은 일부 간단한 쿼리 시나리오에 적합하다는 것입니다. 🎜Yii::$app->db->createCommand()
메서드를 사용하여 Command 객체를 생성한 다음 해당 객체의 execute()SQL문을 실행하는 방법입니다. 🎜🎜다음은 명령 쿼리의 예입니다. 🎜rrreee🎜이 예에서는 먼저 Yii::$app->db->createCommand()
메서드를 사용하여 Command 개체를 만듭니다. , 그런 다음 개체의 update()
메서드를 사용하여 업데이트 문이 구성됩니다. 이 메서드는 author
가 "admin"인 post
테이블의 모든 레코드를 업데이트합니다. " 상태 속성은 1로 업데이트됩니다. 마지막으로 execute()
메서드를 사용하여 업데이트 문을 실행합니다. 🎜🎜원본 SQL 쿼리🎜🎜🎜특수한 경우에는 Active Record, 쿼리 빌더 또는 명령 쿼리를 통해 처리할 수 없는 일부 복잡한 쿼리 문을 실행해야 할 수도 있습니다. 원래 SQL 쿼리를 사용하십시오. Yii 프레임워크에서는 Yii::$app->db->createCommand()
메서드를 사용하여 Command 객체를 생성한 다음 해당 객체의 setSql() 메소드를 사용하여 원본 SQL 문을 지정하고 <code>queryAll()
메소드를 사용하여 쿼리를 실행합니다. 🎜🎜다음은 원시 SQL 쿼리의 예입니다. 🎜//创建一个命令对象,并执行原始SQL查询
$connection = Yii::$app->db;
$command = $connection->createCommand("
SELECT p.id, p.title, u.username
FROM post p LEFT JOIN user u ON p.author_id = u.id
WHERE p.status = 1 AND u.role = 'admin'
ORDER BY p.created_at DESC
LIMIT 10 OFFSET 0
");
$posts = $command->queryAll();
这个例子中,我们首先创建了一个Command对象,并使用setSql()
方法指定一条原始的SQL查询语句。该语句将post
表和user
表进行左连接,查询出所有状态为1且用户角色为“admin”的文章,并按照发布时间倒序排序,返回前10条记录。最后,我们使用queryAll()
方法执行该查询,并返回所有符合要求的记录。
总结:
在Yii框架中,我们可以使用多种方式来访问数据库中的数据,包括Active Record查询、Query Builder查询、命令查询和原始SQL查询。不同的查询构建器适用于不同的查询场景,我们需要根据实际需求来选择最合适的查询方式。通过本文的介绍,相信读者已经对Yii框架中的数据查询有了更深入的了解,希望对大家在实际开发中使用Yii框架有所帮助。
위 내용은 Yii 프레임워크의 데이터 쿼리: 데이터에 효율적으로 액세스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!