【问题标题】:Eloquent Belongs-to-Many relation using custom intermediate Table Models without 'updated_at' field使用没有“updated_at”字段的自定义中间表模型的 Eloquent Belongs-to-Many 关系
【发布时间】:2021-06-07 03:15:53
【问题描述】:

我正在使用 Laravel 8,在我的应用程序中,我与自定义模型有很多关系,我想删除“updated_at”字段。

关系

public function tracks() 
{
    return $this->belongsToMany(Track::class)
        ->using(CollectionTrack::class)
        ->withPivot('sort'  , 'created_at' , 'id');
}

自定义模型

class CollectionTrack extends Pivot
{
    use Sortable;

    public const UPDATED_AT = null;
    public $incrementing = true;
    
    public static function enableAutoSort () {
        return false;
    }
}

问题是当我想同步时,它会尝试填充 updated_at 字段。

未找到列:1054 '字段列表'中的未知列 'updated_at'

但是,我使用以下行从模型中删除了 updated_at。

public const UPDATED_AT = null;

而且,只获取 withPivot 中的 created_at。

当我从 withPivot 中删除 created_at 时,问题就消失了,但在这种情况下,当我检索数据时,created_at 不会出现在字段中。

注意:我的目标是禁用 updated_at 时间戳并且只有 created_at 所以当我附加一条新记录时,created_at 集,当我检索它时,模型有这些枢轴字段'sort', 'created_at', 'id.'

【问题讨论】:

标签: php laravel eloquent laravel-8


【解决方案1】:

您要么必须在每个模型中声明 public $timestamps = false;,要么创建一个 BaseModel,在那里定义它,然后让所有模型扩展它而不是 eloquent。请记住,如果您使用 Eloquent,数据透视表必须有时间戳。

更新:请注意,在 Laravel v3 之后,数据透视表中不再需要时间戳。

更新:您还可以通过从迁移中删除 $table->timestamps() 来禁用时间戳

【讨论】:

  • 我只想创建 created_at 时间戳并禁用 updated_at
【解决方案2】:

我认为您可以从迁移中删除 $table->timestamps(),只需添加一个具有默认值当前时间戳的字段 created_at。

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

我猜应该可以。

还有一个answer可以参考。

【讨论】:

  • 感谢您的回答,但数据库端没有问题。当我为中间表使用自定义模型时,问题是检索 created_at 字段。就像withPivot 和自定义模型不兼容!
  • @Hamidreza 你可以试试syncWithoutDetaching('updated_at') laravel.com/docs/5.5/… 吗?这会避免触及 updated_at 字段并且您的工作会完成吗?试试看,否则我猜我们需要编写一些自定义函数。
  • @Hamidreza 你试过这个吗?你也可以发布你的同步函数调用吗?您是否尝试过 atatch 和 detach 的组合?
【解决方案3】:

ORIGINAL ANSWER: https://stackoverflow.com/a/59171175/14290461

在您的模型中添加以下两行:

public $timestamps = ["created_at"]; //only want to used created_at column
const UPDATED_AT = null; //and updated by default null set

第二种方式:

public $timestamps = false; //by default timestamp false

添加这样的功能:

public function setCreatedAtAttribute($value) { 
    $this->attributes['created_at'] = \Carbon\Carbon::now(); 
}

更多关于 laravel 时间戳的信息see

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 2019-02-21
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多