【问题标题】:Laravel: UpdateOrCreate on Relation?Laravel:更新或创建关系?
【发布时间】:2020-06-21 01:16:14
【问题描述】:

用户拥有一辆汽车。

用户

id | name
1  | Bob
2  | Alice

汽车

idMember |  color  |  energy
   1     |  blue   |    0.95

在我拥有的 User 类中

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

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

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

但是,我收到错误消息

"SQLSTATE[42S22]: 找不到列: 1054 未知列 'id' 在 'where 子句'(SQL:更新cars 设置color = 红色,energy = 0.1, updated_at = 2018-01-12 15:26:47 其中id 为空)

他为什么要找

id 为空

?

【问题讨论】:

  • Laravel 期望每个实体都有一个名为 id 的自动递增主键,拥有主键也是关系要求(尽管它可能是 laravel 不支持的复合键) .只需保存您的理智并在该表中添加一个自动递增的id 列,以便所有内容都有一个唯一的ID。同样按照惯例,laravel 期望外键为 <singular other table>_id 即在您的情况下 idMember 应该是 user_id (但您可以在 hasOne 参数中更改它)
  • @apokryfos 哦,是的,你的权利.. 忘记了。但我宁愿更改我的汽车模型的primaryKey,因为在 hasOne 关系中不需要 AI 密钥。
  • 在一对一关系中,外键作为主键也是一种选择。

标签: php laravel-5 eloquent


【解决方案1】:

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

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

这将检查是否存在caridMember === $user->id;如果是这样,请更新 colorenergy。如果没有,它将创建一个带有idMembercolorenergycar 记录。

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

['idMember' => $user->id, 'day' => 'tuesday']

【讨论】:

    【解决方案2】:

    您的汽车模型应该有一个主键,通常称为“id”。创建它。

    【讨论】:

    • 谢谢!这当然是一种解决方法。但我更喜欢汽车表中没有 AI 的解决方案
    【解决方案3】:

    这就是我在不向汽车模型添加不必要的自动递增 id 的情况下解决问题的方法:

    class Car extends Model
    {
    
      protected $primaryKey   = 'idMember';
      public    $incrementing = false;
    

    【讨论】:

    • 现在很好,但是如果你在某个时候决定 User 可以 hasMany Cars,你会遇到麻烦,因为那时有cars 表中没有任何内容被“隔离”为唯一。
    • @JeffreyWesterkamp 很适合一辆车,hasone 没有真正意义,因为人们可能不止一个.. 但在我复杂的现实生活场景中,我有一个 hasone 关系,永远不会是 hasmany :) .但即使我想更改它,我只需将 hasOne 更改为 hasMany,添加 AI 并从 Car 模型中删除顶部的两条线。
    【解决方案4】:

    如果primarykey不是“ID”,请在您的模型中提及primaryKey

    protected $primaryKey = "Your Primary Key";
    

    如果您的主键不需要 icnrementing

    public    $incrementing = false;
    

    就是这样。。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多