Php 如何让Laravel pivot表仅使用在创建时创建的?

Php 如何让Laravel pivot表仅使用在创建时创建的?,php,laravel,laravel-5,eloquent,relationship,Php,Laravel,Laravel 5,Eloquent,Relationship,在处理belongToMany关系时,使用透视表记录该关系 对于许多透视表,关系只是创建然后删除。它们没有自己的属性,因此您永远不会更新它们 我知道我可以这样做来自动设置更新的和创建的 class Foo extends Model { public function bars() { $this->belongsToMany(Bar::class)->withTimestamps(); } } 但如何使用仅创建的_at?我不知道。你可以采取另一种方

在处理belongToMany关系时,使用透视表记录该关系

对于许多透视表,关系只是创建然后删除。它们没有自己的属性,因此您永远不会更新它们

我知道我可以这样做来自动设置更新的和创建的

class Foo extends Model
{
    public function bars() {
        $this->belongsToMany(Bar::class)->withTimestamps();
    }
}

但如何使用仅创建的_at?我不知道。

你可以采取另一种方法:

  • 跳过
    withTimestamps()
    方法(避免在
    列中同时添加
    created\u和
    updated\u)
  • 添加自定义轴列:
    处创建
因此,您的代码:

class Foo extends Model
{
    public function bars() {
        $this->belongsToMany(Bar::class)->withPivot('created_at');
    }  //                               ^^^^^^^^^^^^^^^^^^^^^^^^
}
现在,使用这种方法,您需要在创建记录时手动将
created\u的值设置为

$foo = Foo::find(1);
$foo->bars()->attach($someId, ['created_at' => now()->format('d-m-Y H:i:s')]);
//                             or whatever you use as date   ^^^^^^^^^^^^^
此外,默认情况下,此列不会转换为
日期
,这与Laravel处理时间戳列的方式相反,因此:

$foo->bars()->first()->pivot->created_at
不会是一个例子。如果需要,请指定并更新关系以使用自定义轴模型:

Pivot模型
FooBar.php

class FooBar extends Pivot // <--
{
    protected $casts = [
        'created_at' => 'datetime:d-m-Y H:i:s',
    ];
}
class Foo extends Model
{
    public function bars() {
        $this->belongsToMany(Bar::class)->using(FooBar::class)->withPivot('created_at');
//                                       ^^^^^^^^^^^^^^^^^^^^
    }
}