Laravel 5 Eloquent关系:无法修改/覆盖关系表属性

8

我正在使用Laravel 5的belongsToMany方法来定义使用中间枢表关联的相关表。我的应用程序正在使用eloquent模型TourTourCategory。在Tour Model中,我有:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tour extends Model
{
    public function cats(){
        return $this->belongsToMany('App\TourCategory', 'tour_cat_assignments', 'tour_id', 'cat_id');
    }

}

在我的控制器中,我使用Laravel的with方法检索来自tour表的所有数据以及相关联的类别数据:

$tours = Tour::with('cats')->get();

这一切都很好。问题在于我不想要当前原始形式的类别数据,我需要先重新排列它。但是,在未取消设置之前,我无法覆盖cats属性:

public function serveTourData(){

    $tours = Tour::with('sections', 'cats')->get();

    foreach($tours as $tour){

        unset($tour->cats); // If I unset first, then it respects the new value. Why do I need to do this?

        $tour->cats = "SOME NEW VALUE";
    }

    Log::info($tours);
}

有人能解释一下这背后的逻辑吗?


你找到解决方法了吗?我也遇到了同样的问题。 - Iván Sánchez
我认为这实际上只是php的foreach方法工作方式的一个特性。我记不清了,但我可能只是按照上面的代码先使用了unset。 - Inigo
是的,我也是这样做的。无论如何,谢谢。 - Iván Sánchez
我也在寻找解决方案。虽然使用了unset的解决方法,但并不是很满意 :-( - Mike
1个回答

13

1
非常感谢。那救了我。 - Tang Chanrith
在我一小时的挣扎中帮助了我,谢谢! - Jaeger
我正在使用5.5版本,按照你说的方式工作并记录日志,但是不知道为什么当我通过response()->json()发送响应时,它根本不显示我的关联,更别提我设置的数组了。 - Daniyal Nasir
很高兴看到你的代码 @DaniyalNasir - mcklayin

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