Я не понимаю, как получить доступ к имени таблицы в том же классе.
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();
}
}
Использование красноречивых моделей Волшебные Функции это позволит вам получить нестатические методы нового экземпляра класса с помощью статического вызова функции; Осветить / База данных / Красноречивым / Model :: __ callStatic ().
__callStatic () срабатывает при вызове недоступных методов в статическом контексте.
Глядя на код для подсветки / базы данных / Eloquent / Model :: __ callStatic () мы видим $instance = new static;
который вызывает Поздние статические привязки. Это означает, что значение, которое вы получите, будет таким же, как у нового экземпляра класса. Как @ PeterPan666 прокомментировал, это будет работать, только если запрошенный метод вообще не существует в текущем классе. Глядя на код для подсветки / базы данных / Eloquent / Model :: __ call () мы видим, что этот вызов будет отправлен на новый запрос строитель для таблицы модели.
Как Альваро Гимарайнш ответил, Вы можете начать запрос к таблице модели, используя 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
через $this->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())->...
Или просто сделайте функцию нестатичной, удалив ключевое слово static.
Используйте обычный статический синтаксис:
<?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();
}
}