在 OctoberCMS 中使深度相关领域可搜索
Making a deep related field searchable in OctoberCMS
我的 columns.yaml
模型的 Invoice
文件我有以下列:
transaction[user][email]:
label: Login email
type: text
searchable: true // doesn't work!
不幸的是,searchable
位不起作用,我知道这是因为我使用 transaction[user][email]
而不是 relation
和 select
作为一部分列的。
我的问题是,当我像这样深入 2 个关系时,我能否以某种方式使用 relation
和 select
,或者我是否需要不同的方法?
我的 Invoice
模型定义了这个关系:
public $morphOne = [
'transaction' => ['Namespace\Plugin\Models\Transaction', 'name' => 'transactionable']
];
我的 Transaction
模型定义了这个关系:
public $belongsTo = [
'user' => ['Rainlab\User\Models\User'],
];
所以,从本质上讲,我希望能够有一个发票后端列表,其中一列显示用户的电子邮件地址,并且还可以在搜索框中按顺序输入电子邮件地址仅针对与具有该电子邮件地址的用户关联的发票过滤列表。
嗯,我在本地试过一个演示,效果很好。
在您的 Controller
中添加此代码 we are going to extend query
以添加我们的 custom field
,它可以是 searchable
甚至它的 2 relation deeper
<?php
use Rainlab\User\Models\User;
use Namespace\Plugin\Models\Invoice;
use Namespace\Plugin\Models\Transaction;
... your controller code ...
public function listExtendQuery($query)
{
$invoiceTableName = (new Invoice)->getTable();
$transactionTableName = (new Transaction)->getTable();
$userTableName = (new User)->getTable();
$query->addSelect($userTableName . '.email as email');
$query->leftJoin($transactionTableName, $invoiceTableName . '.id', '=', $transactionTableName . '.invoice_id');
$query->leftJoin($userTableName, $userTableName . '.id', '=', $transactionTableName . '.user_id');
}
...
现在在您的 columns.yaml
中添加此
columns:
id:
label: id
type: number
invisible: false
... other columns
email:
label: user_email
type: text
default: none
searchable: true
select: email
现在您也可以 search from email
,希望这会奏效
如果您有任何错误,请发表评论。
这个解决方案有一个问题,当您尝试搜索时,它运行查询计数记录并抛出异常 "column not found",因为在计数查询中它没有 select 语句但是在我的例子中只有 "select count ..." 它看起来像 -
未找到列:'where clause' 中的 1054 未知列 'cruises.pagetitle' (SQL: select count(*) as aggregate from cruises
left join cr_cab
as crc
在 crc
.cab_id
= cruises
.id
左加入 chartercruise
作为 chrc
在 chrc
.id
= crc
.cruise_id
where ... or (lower(cruises.pagetitle) LIKE %thaty%)))" on line 664 of C:\xampp\htdocsknots_october\vendor\laravel\framework\src\Illuminate\Database\Connection .php
columns.yaml
页面标题:
标签:'Connected Cruise'
类型:文字
默认值:none
可搜索:真实
可排序:真
public function listExtendQueryBefore($query) {
$query->addSelect('chrc.pagetitle');
$query->leftJoin('cr_cab as crc', 'crc.cab_id', '=', 'cruises.id');
$query->leftJoin('chartercruise as chrc', 'chrc.id', '=',
'crc.cruise_id');
}
我的 columns.yaml
模型的 Invoice
文件我有以下列:
transaction[user][email]:
label: Login email
type: text
searchable: true // doesn't work!
不幸的是,searchable
位不起作用,我知道这是因为我使用 transaction[user][email]
而不是 relation
和 select
作为一部分列的。
我的问题是,当我像这样深入 2 个关系时,我能否以某种方式使用 relation
和 select
,或者我是否需要不同的方法?
我的 Invoice
模型定义了这个关系:
public $morphOne = [
'transaction' => ['Namespace\Plugin\Models\Transaction', 'name' => 'transactionable']
];
我的 Transaction
模型定义了这个关系:
public $belongsTo = [
'user' => ['Rainlab\User\Models\User'],
];
所以,从本质上讲,我希望能够有一个发票后端列表,其中一列显示用户的电子邮件地址,并且还可以在搜索框中按顺序输入电子邮件地址仅针对与具有该电子邮件地址的用户关联的发票过滤列表。
嗯,我在本地试过一个演示,效果很好。
在您的 Controller
中添加此代码 we are going to extend query
以添加我们的 custom field
,它可以是 searchable
甚至它的 2 relation deeper
<?php
use Rainlab\User\Models\User;
use Namespace\Plugin\Models\Invoice;
use Namespace\Plugin\Models\Transaction;
... your controller code ...
public function listExtendQuery($query)
{
$invoiceTableName = (new Invoice)->getTable();
$transactionTableName = (new Transaction)->getTable();
$userTableName = (new User)->getTable();
$query->addSelect($userTableName . '.email as email');
$query->leftJoin($transactionTableName, $invoiceTableName . '.id', '=', $transactionTableName . '.invoice_id');
$query->leftJoin($userTableName, $userTableName . '.id', '=', $transactionTableName . '.user_id');
}
...
现在在您的 columns.yaml
中添加此
columns:
id:
label: id
type: number
invisible: false
... other columns
email:
label: user_email
type: text
default: none
searchable: true
select: email
现在您也可以 search from email
,希望这会奏效
如果您有任何错误,请发表评论。
这个解决方案有一个问题,当您尝试搜索时,它运行查询计数记录并抛出异常 "column not found",因为在计数查询中它没有 select 语句但是在我的例子中只有 "select count ..." 它看起来像 -
未找到列:'where clause' 中的 1054 未知列 'cruises.pagetitle' (SQL: select count(*) as aggregate from cruises
left join cr_cab
as crc
在 crc
.cab_id
= cruises
.id
左加入 chartercruise
作为 chrc
在 chrc
.id
= crc
.cruise_id
where ... or (lower(cruises.pagetitle) LIKE %thaty%)))" on line 664 of C:\xampp\htdocsknots_october\vendor\laravel\framework\src\Illuminate\Database\Connection .php
columns.yaml 页面标题: 标签:'Connected Cruise' 类型:文字 默认值:none 可搜索:真实 可排序:真
public function listExtendQueryBefore($query) {
$query->addSelect('chrc.pagetitle');
$query->leftJoin('cr_cab as crc', 'crc.cab_id', '=', 'cruises.id');
$query->leftJoin('chartercruise as chrc', 'chrc.id', '=',
'crc.cruise_id');
}