我不明白如何在同一个类中访问表名。
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();
}
}
如何用受保护的Table变量替换“timesheets”?
答案 0 :(得分:2)
(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();
}
}
Eloquent Models使用Magic Functions,允许您通过静态函数调用检索新的类实例的非静态方法; Illuminate/Database/Eloquent/Model::__callStatic()
在静态上下文中调用不可访问的方法时会触发
查看code for Illuminate/Database/Eloquent/Model::__callStatic()我们看到$instance = new static;
调用Late Static Bindings。这意味着您将获得的值与新的类实例化相同。作为@PeterPan666 commented,只有在当前类中根本不存在所请求的方法时,这才会起作用。查看code for Illuminate/Database/Eloquent/Model::__call(),我们会看到此调用将发送到模型表的新查询Builder。
作为Álvaro Guimarães answered,您可以使用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();
}
}
答案 1 :(得分:0)
Manual for PhP visibility。受保护的变量可以在类本身和继承的类中访问,因此您可以尝试进行的操作。它由关键字$this
调用。但是,您的函数声明为static
,这会导致$this->
出现问题。尝试:
return DB::table((new static)->getTable())->...
或者通过删除static关键字简单地使函数非静态。
答案 2 :(得分:0)
您已将getAllTimesheets
定义为静态函数。
但是,静态函数与类相关联,而不是类的实例。因此,getAllTimesheets不提供$ this。
要访问$ table变量,请将getAllTimesheets定义为
的实例方法public function getAllTimesheets() { // Code // }
有了这个,你可以在函数中访问$ this变量,并且可以访问$table variable
到$this->table
答案 3 :(得分:0)
您无法像这样访问$ 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方法来为模型构建表名。
答案 4 :(得分:0)
使用常规静态语法:
qhull