yii2 如何使 1:1:1 关系在 GridView 中可排序和可搜索
yii2 how to make a 1:1:1 relationship sortable and searchable in GridView
给定 3 个实体与会者、事件、位置,其中每个与会者都有一个事件,每个事件都有一个位置 - 如何在与会者的 GridView 中显示可排序和可搜索的位置列名称?
架构
CREATE TABLE `attendee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventId` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_attendee_event` FOREIGN KEY (`eventId`) REFERENCES `event` (`id`))
CREATE TABLE `event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`locationId` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_e_l` FOREIGN KEY (`locationId`) REFERENCES `location` (`id`))
CREATE TABLE `location` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL)
我用 gii 生成了模型和 crud。
我希望与会者的 GridView 中的位置名称可以排序和搜索。
我想我必须通过事件定义与会者和位置之间的关系:
public function getLocation()
{
return $this->hasOne(Location::className(), ['id' => 'locationId'])->via('event');
}
在 _columns.php 中,我将 location.name
添加为列:
[
'class'=>'\kartik\grid\DataColumn',
'attribute'=>'location',
'value' => 'location.name'
],
location.name
显示为一列,但它不可排序也不可搜索。我该如何实现?
用于在您的模型搜索中排序
添加排序条件例如:
$dataProvider->setSort([
'attributes' => [
'location.name' => [
'asc' => [ 'location.name' => SORT_ASC],
'desc' => [ 'location.name' => SORT_DESC],
'label' => 'location.name'
],
对于查询添加您的查询条件到其他查询例如:
$query->joinWith(['location' => function ($q) {
$q->where( 'name LIKE "%' . $this->location_name . '%"');
}]);
您可以在 this tutorial
中找到有用的示例
给定 3 个实体与会者、事件、位置,其中每个与会者都有一个事件,每个事件都有一个位置 - 如何在与会者的 GridView 中显示可排序和可搜索的位置列名称?
架构
CREATE TABLE `attendee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventId` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_attendee_event` FOREIGN KEY (`eventId`) REFERENCES `event` (`id`))
CREATE TABLE `event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`locationId` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_e_l` FOREIGN KEY (`locationId`) REFERENCES `location` (`id`))
CREATE TABLE `location` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL)
我用 gii 生成了模型和 crud。
我希望与会者的 GridView 中的位置名称可以排序和搜索。
我想我必须通过事件定义与会者和位置之间的关系:
public function getLocation()
{
return $this->hasOne(Location::className(), ['id' => 'locationId'])->via('event');
}
在 _columns.php 中,我将 location.name
添加为列:
[
'class'=>'\kartik\grid\DataColumn',
'attribute'=>'location',
'value' => 'location.name'
],
location.name
显示为一列,但它不可排序也不可搜索。我该如何实现?
用于在您的模型搜索中排序
添加排序条件例如:
$dataProvider->setSort([
'attributes' => [
'location.name' => [
'asc' => [ 'location.name' => SORT_ASC],
'desc' => [ 'location.name' => SORT_DESC],
'label' => 'location.name'
],
对于查询添加您的查询条件到其他查询例如:
$query->joinWith(['location' => function ($q) {
$q->where( 'name LIKE "%' . $this->location_name . '%"');
}]);
您可以在 this tutorial
中找到有用的示例