Laravel 5.4模型关系

时间:2017-05-25 05:35:06

标签: laravel model relationship laravel-5.4

我创建了三个表用户,课程和user_courses,如下所示

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `status` enum('0','1') COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

    CREATE TABLE `courses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` text,
  `description` text,
  `price` varchar(255) DEFAULT NULL,
  `schedule` varchar(255) DEFAULT NULL,
  `duration` varchar(255) DEFAULT NULL,
  `summary` text,
  `skills` text,
  `mode` enum('0','1') DEFAULT NULL COMMENT '0-Online 1 -Instructor',
  `random_token` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

CREATE TABLE `user_courses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `course_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

现在有了这些表,我想绑定关系,例如当我获取用户时,我能够为用户获取课程,当我到达课程时,我希望用户与课程相关联。 请帮助我如何实现它。

2 个答案:

答案 0 :(得分:2)

我已经得到了答案,所以如果可以帮助任何人,请将其发布在此处。 这里的主要内容是分配多对多关系。在我的用户模型中,我定义了

public function courses()
    {
        return $this->belongsToMany('App\Course');
    }

课程模型

public function users()
    {
        return $this->belongsToMany('App\User');
    }

实际上,这取决于您希望如何使用这种关系。在代码的某些部分,您需要$ user->课程或更有可能查询$ course->用户或两者。 现在这里user_course表将被假定为数据透视表。所以在模型中,你可以把它写成

public function courses()
{
    return $this->belongsToMany('App\Course', 'user_courses');
}

在这里你还可以指定特定数据透视表的字段的实际名称,即user_courses表。然后,我们要做的只是添加另外两个参数,首先是当前模型字段,然后添加字段模型加入像

public function courses()
    {
        return $this->belongsToMany('App\Course', 'user_courses','user_id', 'course_id');
    }
So using the above model relationship you can easily fetch users with all the respective courses by 


 User::->with('courses')->get();

答案 1 :(得分:0)

首次修复

首先,修复user_course表结构,user表的id为整数,而user_course在user_id中作为bigint引用。

解决方案

首先要做的是在应用程序中创建模型。然后在模型中创建关系,最后使用这些关系。

创建模型

使用命令行

php artisan make:model Course
php artisan make:model UserCourse

如果您愿意,可以手动创建它们。默认情况下,它们将在名为 App 的app文件夹中创建。例如,用户模型将是应用程序/用户,依此类推。

用户模型已经存在,因为它随laravel默认安装一起提供。

创建关系

在用户模型中添加以下功能

public function courses()
{
  $this->belongsToMany(Course::class, 'user_course');
}

如果您不打算在课程与用户之间建立一种崇敬的关系,则可以将课程模型留空。上面的定义了从用户到课程的关系

用法

在控制器中说你可以用它作为

public function someFunctionInController()
{
    $usersWithCourses = \App\User::with('courses')->get()->toArray(); 

    //result of a single user record will look something like this
   /**
   [
      'id' =>  1,
      'name' => 'some name'
      ... //other users table columns
      //the courses will be an array of array content and will be automatically injected
      'courses' => [[  
         'id' => 1 //the course id
         ... //course table columns,
         'pivot' => [
             'user_id' => 1,
             'course_id' => 1
         ]
      ],[
         'id' => 3 //the course id
         ... //course table columns,
         'pivot' => [
             'user_id' => 1,
             'course_id' => 3
         ]
      ]]
   ]
   **/

}