У меня есть следующие модели:
<?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 пакет) в таблице данных с нумерацией страниц на стороне сервера / сортировкой / поиском:
<?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
предложение для конкретного столбца. Но насколько я могу сказать это а) требует, чтобы вы определили столбец вручную с помощью построителя запросов, и б) работает только на модели напрямую, а не на одном из ее отношений.
Есть ли способ, которым я могу искать и сортировать это свойство аксессора так же, как я могу с «реальными» свойствами отношения?
Вы можете попробовать установить: https://github.com/babenkoivan/scout-elasticsearch-driver
Этот пакет предлагает возможность определения пользовательских правил для SQL-запросов.
Увидеть:
Попробуйте добавить аксессуар к модели.
class Department extends Model {
protected $appends = ['email'];
// the rest of your code
}
Примечание: атрибуты в appends
массив также будет уважать visible
а также hidden
Настройки настроены на модель.
Источник: Добавление значений в JSON