在 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] 而不是 relationselect 作为一部分列的。

我的问题是,当我像这样深入 2 个关系时,我能否以某种方式使用 relationselect,或者我是否需要不同的方法?

我的 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 crccrc.cab_id = cruises.id 左加入 chartercruise 作为 chrcchrc.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');

     }