Intereting Posts
Как искать URL-адреса, которые не находятся ни в одном теге html, а затем превращать их в гиперссылки? MySQL – Как хранить AES_Encrypted данные? Идеальный размер сеанса PHP? preg_match () или аналогичная функция для проверки валюты выбор всех заказов за последние 30 дней и подсчет количества в день Yii Ошибка: невозможно изменить информацию заголовка – заголовки, уже отправленные regex (в PHP), чтобы соответствовать &, которые не являются объектами HTML Персонализированные, взвешенные рекомендации – рейтинг всех материалов Как получить доступ к Json Response Получение информации из файла Реструктурировать контактную форму php file_get_contents jpg corrupt скачать сложность передачи японских символов (UTF-8) через json_encode Как добавить цифровую подпись (RSA, сертификат и т. Д.) В любой файл, используя PHP? Возьмите значение на странице php, отправленной с помощью функции jquery

Как получить доступ к переменной защиты в классе Laravel

Я не понимаю, как получить доступ к имени таблицы в пределах одного класса.

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(); } }