Laravel attach()方法不适用于hasMany方面

时间:2014-02-05 01:02:00

标签: php laravel-4

该应用程序具有以下模型:

Atividade.php

class Atividade extends Eloquent {
    public function intervencoes() {
        return $this->belongsToMany('Intervencao');
    }
}


Intervencao.php

class Intervencao extends Eloquent {
    public function atividades() {
        return $this->hasMany('Atividade');
    }
}


以下代码有效:

Atividade::find($id)->intervencoes()->attach($intervencao_id);

但是,这......

Intervencao::find($id)->atividades()->attach($atividade_id);

返回BadMethodCallException:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: attach()


解决方案(感谢@gnack):

我试图建立一个多对多的关系,所以只需要改变这个......

return $this->hasMany('Atividade');

对此:

return $this->belongsToMany('Atividade');

4 个答案:

答案 0 :(得分:20)

请参阅此处的Laravel文档: http://laravel.com/docs/eloquent#inserting-related-models

基本上,您为同一个两个表设置了两种不同类型的关系 - 您设置了多对多和一对多。看起来你可能想要多对多,所以你需要改变这一行:

return $this->hasMany('Atividade');

对此:

return $this->belongsToMany('Atividade');

这会将关系设置为多对多关系,然后支持attach()方法。

attach()方法仅适用于多对多,对于其他关系,save()saveMany()associate()(请参阅上面链接的文档)。

答案 1 :(得分:1)

attach()适用于多对多关系。看来你的关系应该是多对多的,但你还没有正确设置它。

class Intervencao extends Eloquent {
    public function atividades() {
        return $this->belongsToMany('Atividade');
    }
}

然后attach()应该正常工作

答案 2 :(得分:1)

请参阅文档Laravel 5.7

评论属于唯一帖子

class Comment extends Model
{
    /**
     * Get the post that owns the comment.
     */
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

帖子可以有多个评论

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }

当您要更新/删除belongsTo关系时,可以使用associate / dissociate方法。

$post= App\Post::find(10);
$comment= App\Comment::find(3);
$comment->post()->associate($post); //update the model

$comment->save(); //you have to call save() method

//delete operation
$comment->post()->dissociate(); 

$comment->save(); //save() method

答案 3 :(得分:0)

在我的情况下,我有两个role()方法,这就是它引发此错误的原因。