我有2个模型:配置文件和学生。配置文件包含一个主键id。学生模型没有任何主键,只有一个外键profile_id,它链接到profile.id。我的学生控制器中有一个函数可以激活学生,在调用时将状态从0设置为1。我正在尝试使用保存()进行值的更新,但无法执行,提示我如下消息:
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');
}
}
学生控制器:
public function activate($id) {
$student = Student::where('profile_id', '=', $id)->first();
$student->status = 1;
$student->save();
return Redirect::to('students');
}
4条答案
按热度按时间332nm8kg1#
您可能需要考虑添加一个
id
字段,它对于Laravel和包(特别是对于聚合)非常重要但如果你非要...
学生模型:( Camel 式
primaryKey
属性)qvk1mo1f2#
我也遇到了同样的问题,无法为该表使用主键字段。
由于Eloquent不能像这样更新表,我决定用不同的方法更新行来解决这个问题:
zf9nrax13#
虽然这个问题有点老,但我想我可以贡献一些东西。
使用没有主键的模型并不值得提倡:如果可能,您应该添加主键。
上面已经说过了,我将解释如何处理模型没有主键的情况,这可能是由于设计缺陷,也可能是因为模型本身不表示实体,而是表示两个或多个实体之间的关系,例如透视表。
正确的方法是在没有主键的模型中重写Model类的setKeysForSaveQuery方法,这允许您修改Laravel默认尝试执行的id = $id条件。
让我们看看:
我必须澄清,这实际上不是一个技巧,Laravel实际上是在透视表的情况下这样做的。
显然,我给出的答案是针对实际上没有主键或者更新条件涉及列组合的情况。在这个问题中,可以假设profile_id是主键,因为student:profile是一对一的关系,让我们看看:
希望这能帮上忙。
n3h0vuf24#
如果有人有同样的问题,我使用Nishchit Dhanani answer,它工作得很好:
将这一行写入您的模型:
其中
_id
是手动主键。在我的例子中,我有一个用户表,部分用户是学生,所以学生表的主键是“user_id”,我在
Student
模型中添加了这一行:我可以在更新学生对象时使用
save()
方法。在您的情况下,您只需要将其添加到您的学生模型: