【发布时间】:2017-04-16 03:16:34
【问题描述】:
我有一个允许用户保存和创建自行车旅行的 CMS。每个自行车之旅也有类别,这些类别是使用 Laravel 的多对多关系使用中间数据透视表定义的。在保存游览时,我们不知道游览是正在编辑的现有游览还是新游览。
我认为我应该使用 Laravel 的 firstOrNew 方法来保存游览,并使用 sync 方法来保存类别。但是,所有教程都非常简单地给出了将单个对象传递给函数的示例,如下所示:
$tour = Tour::firstOrNew($attributes);
但是当我的$attributes 还包含额外的内容时会发生什么,例如链接到关系表的类别,并且我需要在下一步中保存这些内容?例如this very good tutorial 给出了以下示例:
$categories = [7, 12, 52, 77];
$tour = Tour::find(2);
$tour->categories()->sync($categories);
但是,如果类别数据与游览其余部分的数据捆绑在一起,而不是使用 find 我需要使用 firstOrNew 来创建游览,会发生什么?我应该在实例化游览时将类别保留在$attributes 中,然后运行sync,然后在保存游览之前取消设置,还是...?有没有更好的方法来实现这一点?
编辑: 需要明确的是,我的示例中的 $attributes 变量本质上是捆绑在一起的旅游对象数据 - 就像 Laravel/Eloquent 系统会使用 belongsToMany 从事务中返回它一样方法 - 用户随后进行修改)。即:这是它包含的内容的快照:
array (
'id' => 1,
'uid' => '03ecc797-f47e-493a-a85d-b5c3eb4b9247',
'active' => 1,
'code' => '2-0',
'title' => 'Tour Title',
'url_title' => 'tour_title',
'distance_from' => 20,
'distance_to' => 45,
'price_from' => '135.00',
'price_to' => '425.00',
'created_at' => '2013-12-31 15:23:19',
'updated_at' => '2015-07-24 16:02:50',
'cats' => // This is not a column name!
array (
0 => 1,
1 => 7
),
)
所有这些属性都是我的 tours 表中的列名,除了 cat,它通过 hasMany 关系引用另一个表。是否需要手动取消设置才能设置此对象类并使用$tour->save 保存?
我正在寻找最干净最 Laravel 的方式来做到这一点?
EDIT2:以下是 Tours 模型中定义的关系:
class Tour extends Model
{
protected $guarded = [];
public function cats(){
return $this->belongsToMany('App\TourCategory', 'tour_cat_assignments', 'tour_id', 'cat_id');
}
}
【问题讨论】: