我有一张包含个人资料的表格。在此表中,无法知道用户有权访问每一行。
CREATE TABLE `rw_profiles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
)
然后我有另一个表来链接每个用户的个人资料。此表可以包含相同的profile_id
但不同的user_id
(许多用户可以访问相同的配置文件)。
CREATE TABLE `rw_profile_access` (
`profile_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
UNIQUE KEY `profile_access_profile_id_owner_unique` (`profile_id`,`owner`),
KEY `profile_access_user_id_foreign` (`user_id`),
CONSTRAINT `profile_access_profile_id_foreign` FOREIGN KEY (`profile_id`) REFERENCES `rw_profiles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `profile_access_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `rw_users` (`id`)
)
如何列出用户也可以访问的所有配置文件?你应该使用with
- 方法吗?
像$profiles = Profile::with('...')->get();
?
截至目前,我已加入该表。
$profiles = Profile::join('profile_access', function($query) use ($user) {
$query
->on('profile_id', '=', 'profiles.id')
->on('user_id', '=', DB::raw($user['id']));
})->get(['profiles.*']);
有效。这是唯一的方式,还是可以在没有加入的情况下完成?
答案 0 :(得分:3)
您需要在用户和个人资料模型中定义多对多关系。他们需要像以下方法:
class User {
public function Profiles()
{
return $this->belongsToMany('Profile', 'rw_profile_access', 'user_id', 'profile_id');
}
}
class Profile {
public function Users()
{
return $this->belongsToMany('User', 'rw_profile_access', 'profile_id', 'user_id');
}
}
Profiles()和Users()的参数对应于:
然后您可以这样查询:
$users_with_their_profiles = User::with('profiles')->get();
$users_that_definitely_have_profiles = User::with('profiles')->has('profiles')->get();
Laravel文档在http://laravel.com/docs/eloquent#relationships详细解释了这一点。
答案 1 :(得分:0)
你可以使用多对多关系。
http://laravel.com/docs/eloquent#working-with-pivot-tables
或强>
假设你有ProfileAccess
型号。
$profiles = ProfileAccess::with('profile')
->where('user_id', $user['id'] )
->get();
foreach($profiles as $profile) {
dd($profile->profile->name);
}