我有两个模型,分别是User
和Group
,它们之间存在多对多关系。
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
方法,那么问题是什么?
答案 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
方法的单个对象而不是集合。