Как получить доступ к защищенной переменной в классе 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();
}
}

Как я могу заменить «табели» на защищенную переменную таблицы?

1

Решение

Прямой ответ (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();
}
}
2

Другие решения

Вы определили getAllTimesheets как статическая функция.

Однако статические функции связаны с классом, а не с экземпляром класса. Таким образом, $ this недоступно в getAllTimesheets.

Чтобы получить доступ к переменной $ table, определите getAllTimesheets как метод экземпляра как

public function getAllTimesheets() { // Code // }

Благодаря этому вы можете получить доступ к переменной $ this внутри функции и получить доступ к $table variable через $this->table

0

Вы не можете получить доступ к таблице $, как это. Хотя вы можете сделать что-то вроде

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 способ построения имени таблицы с моделью.

0

Руководство по видимости PhP. Защищенные переменные доступны внутри самого класса и унаследованных классов, поэтому то, что вы пытаетесь сделать, возможно. Это называется ключевым словом $this, Однако ваша функция объявлена ​​как static, что вызывает проблемы с $this->, Пытаться:

 return DB::table((new static)->getTable())->...

Или просто сделайте функцию нестатичной, удалив ключевое слово static.

0

Используйте обычный статический синтаксис:

<?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();
}
}
0
По вопросам рекламы [email protected]