如何从laravel中的模型获取主键名称?
像这样dd(User::primaryKeyName()); // -> 'user_id'
我想按主要排序数据排序'是空的
$data = User::orderBy(Input::get('order', User::primaryKey()), 'ASC')->get();
但有
Non-static method Illuminate\Database\Eloquent\Model::getKeyName() should not be called statically, assuming $this from incompatible context
答案 0 :(得分:10)
该方法尝试从受保护的类属性return $this->primaryKey;
获取值,而$this
需要来自类实例的上下文。如果你真的需要动态获取该名称,可以这样做:
App::make('User')->getKeyName();
所以你的代码看起来像这样:
$data = User::orderBy(Input::get('order', App::make('User')->getKeyName()), 'ASC')->get();
答案 1 :(得分:3)
最快的方法可能就是这样:
(new User)->getKeyName();
(new User)->getTable();
但是,我认为以下两种方法为该方法提供了更清晰的界面。
第一种方法在基础模型类上使用静态方法:
class BaseModel extends Model
{
protected static function KeyName() {
return (new static)->getKeyName();
}
protected static function TableName() {
return (new static)->getTable();
}
}
然后从模型中继承此类:
class ModelName extends BaseModel
{
...
}
使用如下:ModelName::KeyName();
如果您无权访问基础模型类,您还可以使用特征:
trait EloquentGetTableNameTrait
{
public static function TableName()
{
return (new static)->getTable();
}
}
你在模特中使用的是这样的:
class ModelName
{
use EloquentGetTableNameTrait;
...
}
不幸的是,所有这些方法都需要实例化模型的实例,但目前没有其他方法可以检索此值。