Поиск аксессора загруженного отношения из таблиц данных - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующие модели:

<?php
class User extends Model {
    public function department() {
        return $this->hasOne(Department::class);
    }
}

class Department extends Model {
    protected $appends = ["email"];
    public function getEmailAttribute() {
        return "$this->name@$this->domain";
    }
    public function user() {
        return $this->belongsTo(User::class);
    }
}

Я собираю список пользователей, включая их отделы, и показываю это (используя пакет Laravel DataTables ) вdatatable с разбивкой на страницы на стороне сервера / сортировкой / поиском:

<?php
class UserController extends Controller {
    public function dt() {
        $users = User::with("department")
            ->where("location_id", session("current_location"));
        return DataTables::of($users)->make();
    }
}

В настройке datatables один из моих столбцов определяется следующим образом:

{data: "department.email"}

Это отображает emailсвойство accessor без проблем.Проблема возникает, когда я пытаюсь выполнить поиск или сортировку по этому столбцу:

Предупреждение DataTables: идентификатор таблицы = DataTables_Table_0 - Сообщение об исключении:

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец'partments.email 'в' предложении where '

Очевидно, datatables не знает, что это аксессор, и пытается включить его в запрос - с предсказуемыми результатами.

Единственный обходной путь, на который я мог найти ссылку, - это использование filterColumn метода , который позволяет определить пользовательское предложение WHERE для определенного столбца.Но, насколько я могу судить, a) требует, чтобы вы определяли столбец вручную с помощью построителя запросов, а b) работает только с моделью напрямую, а не с одним из ее отношений.

Можно ли как-то искать и сортировать это свойство аксессора так же, как и с "реальными" свойствами отношения?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете попробовать установить: https://github.com/babenkoivan/scout-elasticsearch-driver

Этот пакет предоставляет возможность определения пользовательских правил для запросов sql.

См .:

0 голосов
/ 20 ноября 2018

Попробуйте добавить аксессор к модели.

class Department extends Model {

    protected $appends = ['email'];

    // the rest of your code
}

Примечание. Атрибуты в массиве appends также будут соответствовать настройкам visible и hidden, настроенным в модели.

Источник: Добавление значений в JSON

...