Laravel 5 - 从数据透视表中的集合中获取所有记录
Laravel 5 - Getting all records from a collection within a pivot
好的,所以我正在我的用户和角色之间建立关系 table,一切都很顺利,直到我尝试获取每条记录。例如,如果我只是选择:
User::with('roles')->findOrFail(1);
那么一切都很好,它 returns 用户和在那个实例中分配的 2 个角色。
然而,我无法理解的是:
假设我想要获取所有用户及其所有角色,以便我可以在 table 中显示它们,例如,我该怎么做?我似乎无法理解它。
我认为你只需要使用 get,这就是你应该做的。
控制器:
$users = User::with('roles')->get();
在您的视图文件中,如果用户可以拥有多个角色,您应该使用另一个 foreach:
查看:
@foreach ($user as $user)
<h1>{{ $user->name }}</h1>
@foreach ($user->roles as $role)
<h2>{{ $role->id }}</h2>
@endforeach
@endforeach
关于 eager loading is on eloquent 文档的详细信息。
如果您单独使用 findOrFail 而没有链接另一个方法 User::findOrFail(1)
,它将 return 一个集合,但是一旦您开始添加其他条件,您必须为一个集合调用 ->get()
用户数,->first
或 ->last()
用于单个用户对象,或者如果您使用 ->lists()
执行某些操作,您将获得一个数组。否则,您将获得生成器 class,这是 {{ dd(User::where('id', 1)) }}
的示例
Builder {#1097 ▼
#query: Builder {#1096 ▶}
#model: User {#409 ▶}
#eagerLoad: array:1 [▶]
#macros: array:4 [▶]
#onDelete: Closure {#1102 ▶}
#passthru: array:12 [▶]
}
Builder class 就像一个从未执行过的准备好的语句。调用 dd()
时,您应该会看到类似于以下内容的内容。
这会给你一个集合 {{ dd(\App\User::where('id', 1)->get()) }}
Collection {#1105 ▼
#items: array:1 [▼
0 => User {#1108 ▼
#cardUpFront: false
#dates: array:3 [▶]
#table: "users"
#fillable: array:2 [▶]
#hidden: array:2 [▶]
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:17 [▶]
#original: array:17 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
#forceDeleting: false
}
]
}
或使用 {{ dd(\App\User::where('id', 1)->first()) }}
获取单个对象
User {#1108 ▼
#cardUpFront: false
#dates: array:3 [▶]
#table: "users"
#fillable: array:2 [▶]
#hidden: array:2 [▶]
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:17 [▶]
#original: array:17 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
#forceDeleting: false
}
最后是一个包含 {{ dd(\App\User::where('id', 1)->lists('email','id')) }} 的数组
array:1 [▼
1 => "godfrey17@example.net"
]
希望对您有所帮助。
好的,所以我正在我的用户和角色之间建立关系 table,一切都很顺利,直到我尝试获取每条记录。例如,如果我只是选择:
User::with('roles')->findOrFail(1);
那么一切都很好,它 returns 用户和在那个实例中分配的 2 个角色。 然而,我无法理解的是:
假设我想要获取所有用户及其所有角色,以便我可以在 table 中显示它们,例如,我该怎么做?我似乎无法理解它。
我认为你只需要使用 get,这就是你应该做的。
控制器:
$users = User::with('roles')->get();
在您的视图文件中,如果用户可以拥有多个角色,您应该使用另一个 foreach:
查看:
@foreach ($user as $user)
<h1>{{ $user->name }}</h1>
@foreach ($user->roles as $role)
<h2>{{ $role->id }}</h2>
@endforeach
@endforeach
关于 eager loading is on eloquent 文档的详细信息。
如果您单独使用 findOrFail 而没有链接另一个方法 User::findOrFail(1)
,它将 return 一个集合,但是一旦您开始添加其他条件,您必须为一个集合调用 ->get()
用户数,->first
或 ->last()
用于单个用户对象,或者如果您使用 ->lists()
执行某些操作,您将获得一个数组。否则,您将获得生成器 class,这是 {{ dd(User::where('id', 1)) }}
Builder {#1097 ▼
#query: Builder {#1096 ▶}
#model: User {#409 ▶}
#eagerLoad: array:1 [▶]
#macros: array:4 [▶]
#onDelete: Closure {#1102 ▶}
#passthru: array:12 [▶]
}
Builder class 就像一个从未执行过的准备好的语句。调用 dd()
时,您应该会看到类似于以下内容的内容。
这会给你一个集合 {{ dd(\App\User::where('id', 1)->get()) }}
Collection {#1105 ▼
#items: array:1 [▼
0 => User {#1108 ▼
#cardUpFront: false
#dates: array:3 [▶]
#table: "users"
#fillable: array:2 [▶]
#hidden: array:2 [▶]
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:17 [▶]
#original: array:17 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
#forceDeleting: false
}
]
}
或使用 {{ dd(\App\User::where('id', 1)->first()) }}
获取单个对象User {#1108 ▼
#cardUpFront: false
#dates: array:3 [▶]
#table: "users"
#fillable: array:2 [▶]
#hidden: array:2 [▶]
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:17 [▶]
#original: array:17 [▶]
#relations: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
#forceDeleting: false
}
最后是一个包含 {{ dd(\App\User::where('id', 1)->lists('email','id')) }} 的数组
array:1 [▼
1 => "godfrey17@example.net"
]
希望对您有所帮助。