ManyToMany关系 - 如何在数据透视表中更新属性

时间:2016-04-23 09:50:51

标签: laravel eloquent pivot relationship laravel-5.2

我现在正在学习使用数据透视表: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(上述代码中的weeklyroutine_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));

怎么做?我不知道了!

THX。

1 个答案:

答案 0 :(得分: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'));