Я не понимаю, как получить доступ к имени таблицы в пределах одного класса.
class Timesheets extends Model { protected $table = "timesheets"; public static function getAllTimesheets() { //return DB::table("timesheets")->get(); return DB::table("timesheets") ->join('users', 'name', '=', 'users.name') ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc') ->get(); } }
Как заменить «расписания» на защищенную переменную таблицы?
(new static)->getTable()
class Timesheets extends Model { protected $table = "timesheets"; public static function getAllTimesheets() { return DB::table((new static)->getTable()) ->join('users', 'name', '=', 'users.name') ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc') ->get(); } }
Элегантные модели используют магические функции , которые позволят вам получить нестатические методы экземпляра нового класса через статический вызов функции; Illuminate / Database / Eloquent / Model :: __ callStatic () .
__callStatic () запускается при вызове недоступных методов в статическом контексте.
Рассматривая код для Illuminate / Database / Eloquent / Model :: __ callStatic (), мы видим $instance = new static;
который вызывает поздние статические привязки . Это означает, что значение, которое вы получите, будет таким же, как создание нового класса. Как прокомментировал @ PeterPan666 , это будет работать, только если запрошенный метод вообще не существует в текущем классе. Рассматривая код для Illuminate / Database / Eloquent / Model :: __ call (), мы видим, что этот вызов будет отправлен в новый конструктор запросов для таблицы модели.
Как ответил Álvaro Guimarães , вы можете запустить запрос для таблицы модели, используя static::join()
.
class Timesheets extends Model { protected $table = "timesheets"; public static function getAllTimesheets() { return static::join('users', 'name', '=', 'users.name') ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc') ->get(); } }
Вы определили getAllTimesheets
как статическую функцию.
Однако статические функции связаны с классом, а не с экземпляром класса. Таким образом, $ this не доступно из getAllTimesheets.
Чтобы получить доступ к переменной $ table, определите getAllTimesheets как метод экземпляра как
public function getAllTimesheets() { // Code // }
При этом вы можете получить доступ к переменной $ this в этой функции и получить доступ к $table variable
через $table variable
$this->table
Вы не можете получить доступ к $ table. Хотя вы можете сделать что-то вроде
return DB::table((new static)->getTable())->...
Другое решение – сделать getAllTimesheets
как область действия
public function scopeGetAllTimesheets() { // return DB::table($this->table) return DB::table($this->getTable()) ->join('users', 'name', '=', 'users.name') ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc') ->get(); }
И вы можете так называть
$timeSheets = Timesheets::getAllTimesheets();
Я думаю, что использование getTable
лучше, потому что оно дает вам $table
или Laravel способ построения имени таблицы с помощью модели.
Руководство для видимости PhP . Защищенные переменные доступны внутри самого класса и унаследованных классов, поэтому то, что вы пытаетесь, возможно. Он вызывается ключевым словом $this
. Однако ваша функция объявлена как static
, что вызывает проблемы с $this->
. Пытаться:
return DB::table((new static)->getTable())->...
Или просто сделайте функцию нестатической, удалив статическое ключевое слово.
Используйте регулярный статический синтаксис:
<?php class Timesheets extends Model { protected $table = "timesheets"; public static function getAllTimesheets() { return static::join('users', 'name', '=', 'users.name') ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc') ->get(); } }