为什么雄辩不会在不同的主键上返回错误?

时间:2018-01-12 07:10:28

标签: laravel vue.js eloquent vuejs2 laravel-5.5

我正在处理一个旧的数据库,其中primarykey是'Id'。 Eloquent将主键设置为默认的'id',因此它几乎没有变化,但仍然可能令人困惑。当然我没注意到,我想将更新的模型保存到数据库。没有错误,$model->save()返回很好,但数据库没有更新。此外,我还有其他函数可以从数据库中获取模型,并且它们可以正常工作而不会覆盖$primarykey

所以这是我的问题:为什么没有雄辩的回复任何警告或错误?当然我在文档中发现我应该在模型中覆盖$primarykey,然后一切都完美无缺。

我使用的是MySql 10.1.16-MariaDB。 这是Laravel控制器

 public function update(Request $request, Order $order)
     {
        $order->fill($request->get('data'));
        $order->save();
        $order->products;
        return $order;
     }

Vue.js功能

editOrder () {
    this.fullscreenLoading = true
    axios.put('/web/' + this.url + '/' + this.rowId, {'data': this.row})
      .then(({data}) => {
        this.row = data;
        this.fullscreenLoading = false
      });
  },

Laravel Model是标准的,当然我的模型现在已经正确更新了,当我遇到这个问题时没有$primarykey,我没有提到$fillable和产品的关系,但是在我的项目中他们被定义了和工作。

class Order extends Model
   {
      use LogsActivity;
      protected $table = 'orders';
      protected $primaryKey = 'Id';
      protected $fillable = []
   }

2 个答案:

答案 0 :(得分:1)

如果使用get()create()或类似方法执行查询,它将像以前一样工作,因为在这种情况下Eloquent不使用PK。但是在您在模型中设置find()属性之前,某些方法(例如$primaryKey)将无效。

答案 1 :(得分:0)

您没有收到错误,因为没有错误。

当您运行$order->save()时,生成的查询将类似于:

update `orders` set `field1` = ?, `fieldN` = ?, `updated_at` = ? where `id` is null

这是一个非常有效的SQL语句,当它运行时,它不会产生任何错误。但是,它也不会更新任何记录(除非你有一个id为空的记录)。

更新查询使用null的原因是您的订单模型没有id属性,它具有Id属性,而PHP数组键区分大小写。因此,当Laravel尝试获取id属性的值时,它将返回null,并在查询中使用该值。