多对多的attach()表示试图获取非对象的属性

时间:2016-12-12 12:57:58

标签: php laravel-5 eloquent many-to-many

我有两个与多对多关系相关的数据库表journeysstops。该关系还有第三个表journey_stop(数据透视表)。

模型

这是我的Journey.php模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Journey extends Model
{

    public function stops() {
        return $this->belongsToMany('App\Stop');
    }
}

Stop.php型号:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Stop extends Model
{
    public function journeys(){
        return $this->belongsToMany('App\Journey');
    }

}

控制器

现在在我的控制器中,我编写了一个方法changeStop(stop, journey_id),该方法采用特定的journey_id并为其指定一个停靠点。(即,在该特定stop之间创建关系以及journey)或从stop移除journey(如果已存在)。

以下是方法:

public function changeStop(Request $request, $id)
{
    $stop = $request->all();
    $journey = Journey::find($id);

    if ($journey->stops()->contains($stop->id)) {
        $journey->stops()->detach($stop->id);
    }else{
        $journey->stops()->attach($stop->id);
    }  


    return $journey->stops();
}

但是带有if语句的行会引发错误:

  

尝试获取非对象的属性

我还尝试使用DB直接查询数据透视表,但它会抛出相同的错误。这是代码DB

public function changeStop(Request $request, $id)
{
    $stop = $request->all();
    $journey = Journey::find($id);

    if (
        DB::table('journey_stop')->where(
            'journey_id',
            $id
        )->where(
            'stop_id',
            $stop->id
        )->count() > 0
    ) {
        $journey->stops->detach($stop->id);
    } else {
        $journey->stops->attach($stop->id);
    }

    return $journey->stops();
}

一切似乎都适合我。但它不起作用。我做错了什么?

感谢您的时间:)

1 个答案:

答案 0 :(得分:2)

您也可以使用sync方法构建多对多关联。 sync方法接受要放在中间表上的ID数组。将从中间表中删除不在给定数组中的任何ID。因此,在此操作完成后,只有给定数组中的ID将存在于中间表

$journey->stops()->sync([$stop_id])

要为上述代码工作,请尝试以下方法:

public function changeStop(Request $request, $id)
{
    $stop = $request->all(); // returns an array
    $journey = Journey::find($id);

    if ($journey->stops->contains('id', $stop['id'])) {
            $journey->stops()->detach($stop['id']);
    } else {
        $journey->stops()->attach($stop['id']);
    }

    return $journey->stops;
}