【问题标题】:many to many attach() says trying to get property of non-object多对多 attach() 表示试图获取非对象的属性
【发布时间】:2017-04-27 08:31:30
【问题描述】:

我有两个数据库表 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 并为其分配一个停止。(即,在特定的 stopjourney 之间创建关系)或从journey 中删除stop(如果它已经存在)。

方法如下:

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();
}

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

感谢您的宝贵时间:)

【问题讨论】:

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


    【解决方案1】:

    您也可以使用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;
    }
    

    【讨论】:

    • 非常感谢。有效!你真的让我很开心。几个小时以来,我一直在努力解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多