Laravel:更新或创建关系?

Ada*_*dam 4 php eloquent laravel-5

一个用户有一辆汽车。

用户

id | name
1  | Bob
2  | Alice
Run Code Online (Sandbox Code Playgroud)

汽车

idMember |  color  |  energy
   1     |  blue   |    0.95
Run Code Online (Sandbox Code Playgroud)

用户类里面我有

public function car()
{
  return $this->hasOne('App\Car','idMember');
}
Run Code Online (Sandbox Code Playgroud)

我想像这样在关系模型上调用 updateOrCreate :

$user->car()->updateOrCreate(['idMember' => $user->id], ['color' => 'red', 'energy' => '0.1']); 
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误消息

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: update carsset color= red, energy= 0.1, updated_at= 2018-01-12 15:26:47 where idis null)

他为什么要找

id 一片空白

?

agm*_*984 7

需要明确的是,您的原始语法是正确的。您可以在关系上使用它:

$user->car()->updateOrCreate(['idMember' => $user->id], [
    'color' => 'red',
    'energy' => '0.1',
]);
Run Code Online (Sandbox Code Playgroud)

这将检查是否有carwith idMember === $user->id; 如果是这样,更新colorenergy。如果没有,它将创建一个car记录idMember,包括color、 和energy

我没有测试过,但是根据第一个参数的数组类型,你应该可以传入多个匹配条件,比如

['idMember' => $user->id, 'day' => 'tuesday']
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 2

这就是我解决问题的方法,而无需向汽车模型添加不必要的自动递增 id:

class Car extends Model
{

  protected $primaryKey   = 'idMember';
  public    $incrementing = false;
Run Code Online (Sandbox Code Playgroud)