【问题标题】:Laravel Eloquent updateOrCreate composite key [duplicate]Laravel Eloquent updateOrCreate 复合键 [重复]
【发布时间】:2016-12-02 18:35:19
【问题描述】:

我正在尝试将更改保存到一个数据库表中的记录,该表具有 2 个元素的复合键。 当我尝试使用 Model::updateOrCreate 或 Model::firstOrCreate 方法时,我从数据库中收到一个错误,告诉我 id 不存在。 看起来 laravel 在创建查询时忽略了我提到的初级键。

我的模特:

class CatalogueCatLanguage extends Model
{
  public $incrementing = false;
  protected $table = "CatalogueCatLanguages";
  protected $fillable = ["cataloguecategory_id","language_id","name","description"];
  protected $primaryKey = ["cataloguecategory_id","language_id"];
}

我在控制器方法中的代码:

CatalogoCatLingua::updateOrCreate(
 [
   "cataloguecategory_id"=>$trad["category"],
   "language_id"=>$trad["language"]
 ],[
   "name"=>$trad["langName"],
   "description"=>$trad["langDescription"]
 ]
);

当我拥有“primaryKey”属性时出现的错误:

isset 中的偏移类型非法或为空

当我注释了“primaryKey”属性时出现的错误:

SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列 'id'

我已经尝试了几种组合和方法,但是我没有得到导致此错误的原因。

提前谢谢你。

【问题讨论】:

  • 奇怪,我来这里是为了寻找支持多语言的相同用例的答案。
  • 对于从谷歌搜索中偶然发现此问题的任何人,覆盖 setKeysForSaveQuery 可以解决此问题,如本文laracasts.com/discuss/channels/laravel/… 中所述。

标签: php mysql laravel eloquent


【解决方案1】:

Laravel 不支持复合主键(不过你可以尝试this 解决方案)。您只能在此处使用字符串:

protected $primaryKey = "cataloguecategory_id";

【讨论】:

  • 正如@Alexey 发布的那样,您可以在模型中定义一个主键并在控制器中传递两个主键,作为接收两个数组的 updateOrCreate 方法的两个参数中的第一个。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2015-05-08
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
相关资源
最近更新 更多