在eloquent模型中获取主键名称

时间:2014-10-23 13:38:17

标签: laravel-4 eloquent

如何从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

2 个答案:

答案 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;

    ...
}

不幸的是,所有这些方法都需要实例化模型的实例,但目前没有其他方法可以检索此值。

参考:https://github.com/laravel/framework/issues/1436