이 글의 예시에서는 Yii에서 CGridView 연관 테이블을 검색하고 정렬하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 구현 방법은 다음과 같습니다.
Yii CGridView에서 관련 테이블을 검색하고 정렬하는 구현 방법이 약간 복잡합니다. 오늘은 외국인이 작성한 게임을 읽어보고 정리해서 친구들과 공유하겠습니다. 모두가 Yii 프레임워크를 배울 수 있도록 말이죠.
먼저 블로그 데모에서 protectedmodelsComment.php를 확인하여 댓글 모델에 검색 방법이 있는지 확인하세요. 그렇지 않은 경우 gii를 사용하여 검색 방법을 생성하세요.
그런 다음 코드를 작성할 시간입니다. CommentController로 시작하여 여기에 actionList를 추가합니다.
공용 함수 actionList()
{
$model=새 댓글('검색');
$model->unsetAttributes();
If(isset($_GET['댓글']))
$model->attributes=$_GET['댓글'];
$this->render('목록',배열(
'모델'=>$model,
));
}
별것 아닌 것 같고, gii로 생성한 crud 코드와 똑같습니다. 이제 뷰를 생성하고 /protected/views/comment/ 디렉토리에 list.php를 생성한 후 다음 코드를 붙여넣겠습니다
breadcrumbs=array(
'댓글',
);
?>
댓글 관리
widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'필터'=>$모델,
'열' => 배열(
'콘텐츠',
'포스트.제목',
'상태',
'작가'
),
));
?>
댓글 목록
댓글의 '내용', '상태', '작성자'와 게시물 제목만 표시하는 기본 CGridView입니다. 이 목록에 기사 제목 열을 추가하고 싶다면 post.title:
만 추가하면 됩니다.
'columns'=>array(
'콘텐츠',
'글.제목',
'상태',
'작가',
),
이제 다음 페이지에 접속하시면 기사제목이 실제로 표시되는 걸 보실 수 있습니다
질문:
이 페이지를 자세히 살펴보면 기사 제목을 검색할 수 없고 기사 제목별로 정렬할 수 없다는 것을 알 수 있습니다. 이는 CGridView가 post라는 열 이름에 '.'를 발견했기 때문입니다. .제목의 요점. 점이 있으면 검색창이 생성되지 않습니다.
해결책:
이 문제를 해결하려면 열심히 노력해야 합니다. 먼저 Commen 모델에 getter와 setter를 추가해야 합니다. 예를 들면 다음과 같습니다.
private $_postTitle = null;
공개 함수 getPostTitle()
{
If ($this->_postTitle === null && $this->post !== null)
{
$this->_postTitle = $this->post->제목;
}
$this->_postTitle;
반환
}
공개 함수 setPostTitle($value)
{
$this->_postTitle = $value;
}
다음으로 규칙 함수에 이 속성을 추가합니다.
공용 함수 규칙()
{
// 참고:
// 사용자 입력을 받습니다.
배열 반환(
배열('콘텐츠, 작성자, 이메일', '필수'),
array('작성자, 이메일, URL', '길이', '최대'=>128),
배열('이메일','이메일'),
배열('url','url')
array('content, postTitle, status, 작성자', 'safe', 'on'=>'search'),
);
}
이것만으로는 충분하지 않습니다. 가장 많이 바뀌어야 할 것은 검색 기능입니다. 먼저 기준을 추가해야 합니다.
$criteria=new CDbCriteria;
$criteria->with = "post"; // 반드시 post 테이블을 쿼리하세요
$criteria->compare('t.content',$this->content,true);
$criteria->compare('t.status',$this->status);
$criteria->compare('t.author',$this->author,true);
$criteria->compare('post.title', $this->postTitle,true);
그런 다음 정렬을 추가합니다.
$sort = new CSort();
$sort->속성 = 배열(
'defaultOrder'=>'t.create_time DESC',
'콘텐츠'=>배열(
'asc'=>'t.content',
'desc'=>'t.content desc',
),
'상태'=>배열(
'asc'=>'t.status',
'desc'=>'t.status desc',
),
'작성자'=>배열(
'asc'=>'t.author',
'desc'=>'t.author desc',
),
'postTitle'=>배열(
'asc'=>'post.title',
'desc'=>'post.title desc',
),
);
내가 'tablename'.'columnname' 구문 전체를 사용하고 있다는 것을 눈치채셨을 것입니다. 이렇게 하는 이유는 mysql에서 '열이 모호한 오류'를 발생시키는 것을 방지하기 위함입니다.
이 작업이 제대로 작동하려면 CSort 인스턴스와 CDbCriteria 인스턴스를 CActiveDataProvider에 전달해야 합니다.
return new CActiveDataProvider('Comment', array(
'기준'=>$기준,
'정렬'=>$정렬
));
새 CActiveDataProvider('Comment', array(
반환)
'기준'=>$기준,
'정렬'=>$정렬
));
이제 우리가 해야 할 일은 CGridView에 표시하려는 속성을 표시하도록 뷰를 수정하는 것입니다.
'columns'=>array(
'콘텐츠',
'포스트제목',
'상태',
'작가',
),
새로 고침하면 아래와 같은 효과가 나타납니다.
이 기사가 Yii 프레임워크를 기반으로 PHP 프로그램을 설계하는 데 도움이 되기를 바랍니다.