在Laravel Eloquent的同一模型中具有不同的关系

时间:2019-01-28 17:49:13

标签: laravel eloquent laravel-5.7

我正在建立一个项目,用户可以在其中创建一个事件并加入许多事件, 该活动只有一个所有者,但可以加入许多用户

这是Model Event.php中的方法

public function creator()
{
   return $this->belongsTo(User::class);
}

public function users()
{
   return $this->belongsToMany(User::class);
}

这里是User.php模型中的方法

public function createdEvents()
{
   return $this->belongsTo(User::class);
}

public function joinedEvents()
{
   return $this->belongsToMany(Event::class);
}

这是数据透视表迁移文件

class CreateEventUserTable extends Migration
{
 /**
 * Run the migrations.
 *
 * @return void
 */
 public function up()
 {
   Schema::create('event_user', function (Blueprint $table) {
       $table->unsignedInteger('event_id');
       $table->unsignedInteger('user_id');
       $table->timestamps();
       $table->primary(['event_id', 'user_id']);    

       $table->foreign('event_id')
           ->references('id')->on('events')
           ->onDelete('cascade');

        $table->foreign('user_id')
           ->references('id')->on('users')
           ->onDelete('cascade');
   });
}

这是事件迁移

public function up()
{
   Schema::create('events', function (Blueprint $table) {
       $table->increments('id');
       $table->unsignedInteger('user_id');
       $table->text('content');
       $table->date('date');
       $table->time('time');
       $table->unsignedSmallInteger('min_attendance');
       $table->unsignedSmallInteger('max_attendance');
       $table->string('location');
       $table->unsignedInteger('category_id');
       $table->timestamps();

       $table->foreign('user_id')
        ->references('id')->on('users')
           ->onDelete('cascade');
   });
}

我想知道我做错了什么地方或是否有问题,以避免将来使用Laravel Eloquent检索数据时出现问题

2 个答案:

答案 0 :(得分:1)

您需要更新用户模型。 createdEvents的关系需要像这样:

public function createdEvents()
{
   return $this->hasMany(Event::class);
}

答案 1 :(得分:0)

我认为您应该在事件模型中仅保持这样一种关系:

public function user()
{
   return $this->belongsTo(User::class);
}

您的用户模型如下:

public function events()
{
   return $this->belongsToMany(Event::class);
}


您可以使用第三个名为Subscription的模型,然后在事件和用户之间建立关系表


public function up()
{
   Schema::create('subscriptions', function (Blueprint $table) {
       $table->increments('id');
       $table->unsignedInteger('user_id');
       $table->unsignedInteger('event_id');
       $table->timestamps();

       $table->foreign('user_id')
        ->references('id')->on('users')
           ->onDelete('cascade');

       $table->foreign('event_id')
        ->references('id')->on('events')
           ->onDelete('cascade');
   });
}

最后是订阅模型:

public function users()
{
   return $this->belongsToMany(User::class);
}

public function event()
{
   return $this->belongsTo(Event::class);
}

通过这种方式,您可以使用以下查询访问所有加入您活动的用户:

$joinedUsers = Subscription::where('event_id','=','$id')->pluck('user_id');