【问题标题】:Laravel Model saving data without primary keyLaravel 模型在没有主键的情况下保存数据
【发布时间】:2014-10-15 11:50:30
【问题描述】:

我有 2 个模型:个人资料和学生。配置文件包含一个主键 id。学生模型没有任何主键,只有一个外键 profile_id,它链接到 profile.id。我的学生控制器中有一个函数可以激活学生,在调用时将状态设置为 0 到 1。我正在尝试使用 save() 来更新值,但无法做到这一点,提示我这样的消息:

Column not found: 1054 Unknown column 'id' in 'where clause'

可以请教吗?非常感谢。

学生模型:

class Student extends Eloquent {

    protected $primary_key = null;
    public $incrementing = false;

    protected $fillable = array('username', 'password', 'status', 'profile_id');

    public function profile() {
        return $this->belongsTo('Profile');
    }
}

个人资料模型:

class Profile extends Eloquent {

    protected $fillable = array('firstname', 'lastname', 'email', 'phone');

    public function student()
    {
        return $this->hasOne('Student', 'profile_id', 'id');
    }
}

StudentController:

public function activate($id) {
        $student = Student::where('profile_id', '=', $id)->first();
        $student->status = 1;
        $student->save();
        return Redirect::to('students');
}

【问题讨论】:

  • 你为什么要使用这个? Eloquent 无论如何都不会,因为它依赖于主键(就像任何 ORM 一样)。

标签: php laravel laravel-4


【解决方案1】:

我遇到了同样的问题,无法为该表使用主键字段。

由于 Eloquent 无法像这样更新表,我解决了它,只需决定以不同的方式更新行:

NameOfMyTable::where('entity_type', 1)->update(['last_import' => Carbon::now()]);

【讨论】:

    【解决方案2】:

    如果有人有同样的问题。我使用了 Nishchit Dhanani 的答案 (here),效果很好:
    将此行写入您的模型
    公共 $primaryKey = '_id';
    其中 _id 是您的手动主键

    对于我来说。我有一个用户表,我的部分用户是学生。所以我的学生表中的主键是“user_id”。
    在我的学生模型中添加这一行:public $primaryKey = 'user_id';

    我可以在更新我的学生对象时使用 save() 方法。

    在你的情况下,你只需要添加你的学生模型
    公共 $primaryKey = 'profile_id'

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      您可能需要考虑添加一个id 字段。这对 Laravel 和包(特别是聚合)非常重要

      但如果你必须...

      学生模特:(骆驼案primaryKey财产)

      class Student extends Eloquent {
      
          protected $primaryKey = null;
          public $incrementing = false;
      
      
          protected $fillable = array('username', 'password', 'status', 'profile_id');
      
          public function profile() {
              return $this->belongsTo('Profile');
          }
      }
      

      【讨论】:

      • 我认为您对“primaryKey”的看法是正确的,但是在尝试在代码中更改它时,我在调用该函数时遇到了加载问题。我不确定是否真的需要一个 id 字段才能工作,即使它在我的情况下没有任何用途,但只是为了满足需要主键的要求。
      • 您在更改属性名称后遇到的加载问题是什么?毫无疑问,你可以在没有主键的 Laravel 中使用这个表,但是在尝试集成其他包时可能会变得越来越困难:例如Cruddy。添加primary key 可能会为您省去一些麻烦,而且我想不出任何代价高昂的情况。
      • 注意,官方文档没有提到这种情况,并且在某些原因可能导致意外错误,难以定位和调试,所以我强烈建议大家不要这样做!
      • 我可以确认将 $primaryKey 设置为 null 只会让 Laravel 炸毁并给出一个白屏死机,并且在任何时候尝试更新时都绝对没有任何日志记录。这适用于插入,但不适用于更新。
      • 确认,超级简单的东西,当直接使用 db 时,在 Laravel 中超级复杂。 Laravel 需要主键。没有它,整个框架就会愚蠢地崩溃并且完全没用。所以,用主键设计你的数据库,或者使用其他一些框架,因为 Laravel 对你没用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2011-11-03
      • 2010-12-21
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多