Laravel多对多关系说没有方法使用者

时间:2018-08-08 20:57:04

标签: laravel eloquent

我有两个模型,分别是UserGroup,它们之间存在多对多关系。

Group.php

<?php

namespace BOOK_DONATION;

use Illuminate\Database\Eloquent\Model;

class group extends Model
{
    protected $fillable = [
        'id','book_id',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [

    ];
    public function users(){
        return $this->belongsToMany('BOOK_DONATION\User', 'group_user')->withPivot('last_seen_id');
    }
}

User.php

amespace BOOK_DONATION;
use Illuminate\Http\Request;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use BOOK_DONATION\User;
use BOOK_DONATIOM\Book;
use BOOK_DONATION\group;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email','country','state/provience','city', 'token', 'password','postal_code',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password','verfied', 'remember_token',
    ];

    public function Book(){
        return $this->hasMany('App\Book');
    }

    public function groups(){
        return $this->belongsToMany('BOOK_DONATION\group', 'group_user')->withPivot('last_seen_id');
    }

}

现在我有以下行的控制器:

return view('chat.messaging')->with('group',$group->users());

我得到的是:

  

方法Illuminate \ Database \ Eloquent \ Collection :: users不存在。

但是正如您所看到的,Group模型确实具有users方法,那么问题是什么?

2 个答案:

答案 0 :(得分:3)

这是在告诉您$group是组模型的Collection,而不是Group模型的单个实例。 Collection本身没有称为users的方法。

在您的控制器中,$group是如何定义的?如果您要执行group::all()之类的查询,则最终会得到Collection

通话:

Group::with(['users'])->all();

将加载所有groups和所有users。然后您可以遍历每个组并拥有所有users

编辑:

根据Mark对他的查询的评论,他应该将获取方式更改为第一个以获取单个模型。

$group = group::with(['users'])->where('id', '=', $group_id)->first();

并删除对视图的调用中的括号

return view('chat.messaging')->with('group',$group->users);

答案 1 :(得分:0)

此刻我看到一个错误:

当您在最后用括号括起来的关系 ()时,您将访问该关系本身,这意味着您可以继续添加查询约束,例如:

// with the following you access all the users of the relationship.
$group->users()->get();
// with the following you access all the users of the relationship with an id=123
$group->users()->where('user_id', 123)->get();

现在,当您在结尾处不加括号 ()时,将访问关系的结果,即关系中存在的元素。

因此,在这种情况下,该特定users的{​​{1}}。这将是$group的一个实例,它是Collection模型的集合,在这种情况下,您应该返回到User

view

现在,如果我们查看您的错误消息:

  

方法Illuminate \ Database \ Eloquent \ Collection :: users不存在。

这是告诉您return view('chat.messaging')->with('group', $group->users); // or return view('chat.messaging')->withGroup($group->users); 没有$group方法,但是正如我们在您的代码中看到的那样,它确实有一个。问题一定是您如何获取users对象,可能您正在执行以下操作之一:

$group

这还将返回项目的集合($group = App\Group::where('id', 'some_id')->get(); // or $group = App\Group::all(); / get()),请执行以下操作:

all()

甚至更好:

$group = App\Group::where('id', 'some_id')->first();

这些对象将返回$group = App\Group::find('some_id'); 模型的实例,该实例必须是其中定义了Group方法的单个对象而不是集合。