【问题标题】:Eloquent sync and created_at/updated_atEloquent 同步和 created_at/updated_at
【发布时间】:2014-09-26 12:33:59
【问题描述】:

我有以下代码:

$entry->save();

$categories = [];

$categories[Input::get('main_category')] = ['main' => 1];

for ($i=1; $i<=4 ; ++$i) {
    $input = Input::get('category_'.$i);
    if ($input != '') {
            $categories[$input] = ['main' => 0];
    }
}



$entry->categories()->sync($categories);

$inTags = explode(',', trim( Input::get('tags'), ','));
$tags = [];

foreach ($inTags as $tag) {
    $tag = trim($tag);
    if ($tag == '') {
        continue;
    }
    $fTag = Tag::firstOrCreate(array('name' => $tag));

    $tags[$fTag->id] = ['entry_id' => $entry->id];
}
$entry->tags()->sync($tags);

在上面的代码中,我创建条目($entry-&gt;save() 在这里足以理解它,早期的代码并不重要),然后保存该条目所属的类别(使用数据透视表)并对标签执行相同操作(但对于标签,如果标签不存在,我创建一个)。

但是,在两个数据透视表中,created_at 字段在插入数据后保留为默认值 (0000-00-00 00:00:00)(updated_at 可能与此相同,但我尚未对其进行测试)。

我是否需要以某种方式自动激活归档时间戳,还是需要我自己手动填写它们(但这可能意味着更多的编码并且不使用sync)?

【问题讨论】:

  • 您正在为sync 提供关联数组,而它接受ids 的数组进行同步。对于数据透视表上的时间戳 - 您需要在关系定义上使用 withTimestamps(),否则将不会设置/更新。
  • @JarekTkaczyk 谢谢withTimestamps() 解决了这个问题。但是使用 sync 您可以添加额外的数据透视表 - 查看 laravel.com/docs/4.2/eloquent#working-with-pivot-tables 和部分 Adding Pivot Data When Syncing
  • 是的,如果是数据透视表,您可以这样做。我以为你传递了一个关系键。
  • 你说得对,我用错误的标签外键定义了我的关系

标签: php laravel laravel-4 eloquent


【解决方案1】:

为了在同步/附加belongsToMany 关系时处理数据透视时间戳,您需要在关系定义中包含withTimestamps():

// some model
public function someRelation()
{
  return $this->belongsToMany('RelatedModel')->withTimestamps();
}

然后每个sync/attach/updateExistingPivot 都会设置/更新数据透视表上的时间戳。

【讨论】:

  • 我想软删除被 sync() 删除的数据?
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2017-05-26
  • 2020-03-28
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2011-06-11
相关资源
最近更新 更多