多对多关系 - 如何更新数据透视表中的属性

Posted

技术标签:

【中文标题】多对多关系 - 如何更新数据透视表中的属性【英文标题】:ManyToMany relation - how update attribute in pivot table 【发布时间】:2016-08-16 23:49:34 【问题描述】:

我现在正在学习使用数据透视表:https://laravel.com/docs/4.2/eloquent#working-with-pivot-tables

我有WeeklyRoutine 模型。每个例程都有几个活动。分配的活动附加在数据透视表activity_routine

WeeklyRoutine 模型中定义的关系:

    return $this->belongsToMany('App\Models\Activity', 'activity_routine', 'routine_id', 'activity_id')->withPivot('done_at')->withTimestamps();

看起来像这样:

// activity_routine pivot table (relevant columns only)
| id | activity_id | routine_id  | done_at             |
| 34  | 1          | 4           | 2016-04-23 09:27:27 | // *1
| 35  | 2          | 4           | null                | // *2

*1 使用下面的代码将此活动标记为已完成 *2 此活动尚未完成

我有什么:

我可以更新数据透视表中的 done_at 字段,从而使其在给定的一周内标记为 DONE(上述代码中的 weekroutine_id = 4

public function make_an_activity_complete($routineid, $activityid) 

    $date = new \DateTime;


    $object = Routine::find($routineid)->activities()->updateExistingPivot($activityid, array('done_at' => $date));


    return 'done!';

我需要什么

我想取消一项活动。当它已经完成时,即当done_at 不是null buc 包含日期时,将其设为null

换句话说,我需要做下面的值切换,但是正确的方法:

$pivot = DB::table('activity_routine')->where('routine_id, $routineid)->where('activity_id, $activityid)->first();
if($pivot->done_at != null) 
    $new_val = new \DateTime;
 else 
    $new_val = null;

    $object = Routine::find($routineid)->activities()->updateExistingPivot($activityid, array('done_at' => $new_val));

怎么做?我不知道!

谢谢。

【问题讨论】:

上一个示例中的 if 语句不应该是 === 而不是 != 【参考方案1】:

你的方法对我来说似乎很好。我可能会这样做。

$routine = Routine::find($routineid);
$activity = $routine->activities()->find($activityid);
$done_at = is_null($activity->pivot->done_at) ? new \DateTime : null;

$routine->activities()->updateExistingPivot($activityid, compact('done_at'));

【讨论】:

完美运行。我能问得更深一点吗?我们在这里创建两个变量$routine$activity。有没有办法获得目标活动。喜欢$activity = Routine::find($routine_id)->whereActivities()->find($activityid); $activity 是目标活动。这与您从$activity = Activity::find($activityid); 获得的唯一区别是->pivot 信息。否则它只是一个普通的 Eloquent Model 实例,代表活动表中的一行。这能回答你的问题吗? 呃,不是这样。相同的活动可以分配给不同的Routines,所以我必须创建另一个模型ActivityRoutine。好吧,这并不重要。谢谢!我可以请您注意这里:***.com/questions/36856090/…

以上是关于多对多关系 - 如何更新数据透视表中的属性的主要内容,如果未能解决你的问题,请参考以下文章

在多对多关系 laravel4 的情况下更新数据透视表

GraphQL Apollo 中的多对多关系

laravel4 更新数据透视表中的附加列

在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新

Laravel 5 - 从数据透视表额外属性获取属性

Laravel - 是不是可以与一个表和一个数据透视表建立多对多关系