Laravel如何更新一对一关系?

5

术语表:

  • term_id(术语ID)
  • name(名称)
  • slug(别名)

术语分类表:

  • term_taxonomy_id(术语分类ID)
  • term_id(术语ID)
  • description(描述)

我的术语模型:

public function TermTaxonomy(){
    return $this->hasOne('TermTaxonomy');
}

我的TermTaxonomy模型:

public function Term(){
    return $this->belongsTo('Term');
}

我的分类控制器:

public function update($id){
    echo "$id"; // echo success
    echo $data['name']; // it should update name field in term table
    echo $data['slug']; // it should update slug field in term table
    echo $data['TermTaxonomy']['description']; // it should update description field in termtaxonomy table
}

我该如何更新一对一关系?也许可以使用push()函数。

谢谢,抱歉我是laravel的新手。


1
可能是Laravel最佳方法来保存一对一关系的数据?的重复问题。 - goldlife
我认为这不是重复问题,因为这个问题是关于如何更新的。那么我想知道如何更新。谢谢。 - Dark Cyber
2个回答

15
你可以使用Eloquent的update()方法:https://laravel.com/docs/5.4/eloquent#updates
$Term = Term::with('TermTaxonomy')->find($id);
$Term->name = $data['name'];
$Term->slug = $data['slug'];

// Save The Term first
$Term->save();

// Now update the relation
$Term->TermTaxonomy->update([
    'taxonomy' => 'category',
    'description' => $data['TermTaxonomy']['description']
]);

2

正如Jarek Tkaczyk在这个问题中所评论的那样,目前没有其他方法,因为Eloquent不知道模型上有哪些关系,除非您将它们作为动态属性调用、使用load方法进行加载、预加载等(push仅适用于已加载到模型关系数组中的已加载关系)。

因此,我使用了以下代码。

$Term = Term::with('TermTaxonomy')->find($id);
$Term->name = $data['name'];
$Term->slug = $data['slug'];
$Term->TermTaxonomy->taxonomy = 'category';
$Term->TermTaxonomy->description = $data['TermTaxonomy']['description'];
$Term->push();

它有效。Term和TermTaxonomy表被更新了,但如果将push()更改为save(),它只会更新Term表,即使已经使用Eager加载加载了TermTaxonomy关系

Term::with('TermTaxonomy')

感谢一切:D


需要记住的一件事是,即使它们没有被更改,push将更新所有已加载关系的updated_at时间戳。当使用updated方法保存任何更改的关系数据时,您将更好地控制哪些数据正在更新,并保持该updated_at时间戳更准确,因为它仅在更改的关系上进行更新。根据项目的不同,这可能非常有用和有价值。 - crabbly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接