如何使用Eloquent基于另一个表获取行?

时间:2013-12-19 18:58:46

标签: php laravel eloquent

我有一张包含个人资料的表格。在此表中,无法知道用户有权访问每一行。

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.*']);

有效。这是唯一的方式,还是可以在没有加入的情况下完成?

2 个答案:

答案 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)

你可以使用多对多关系。

Laravel table relationship

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);
}