在Laravel中插入多对多关系表

时间:2019-01-14 11:46:54

标签: php mysql laravel eloquent

在laravel项目中,我有一些表要在其中2个之间插入多对多关系。我想将一个用户(必须是一种更清洁的用户)绑定到当前已通过身份验证的主机用户中的一个众议院。为此,我正在Controller中实现以下功能:

public function hireCleanerToHouse (Request $request)
{
  $house_id = $request->houseAssign;
  $email = $request->email;
  $house = House::find($house_id);
  $cleanerUser = User::where('email', $email)->first();
  if ($cleanerUser && $house){
    $cleanerUser->houses()->attach($house);
  }

  return response()->json('success', 200);
}

我可能缺少无法让我插入任何数据的逻辑细节。我使用laravel和Eloquent ORM相当新。

为帮助您更好地理解,以下是项目中的模型。负责单独表(CRUD)的功能都正常工作。

如果还有其他一些建议可以改善肥胖症,或者如果我忽略了一些最佳实践,那么我会很乐意接受的。

用户:

class User extends Authenticatable
{
use Notifiable;

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'email', 'password'
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

public function host()
{
    return $this->hasOne(Host::class);
}

public function cleaner()
{
    return $this->hasOne(Cleaner::class);
}

}

房屋:

class House extends Model
{
protected $fillable = ['name', 'address', 'host_id'];

protected $dates = ['created_at', 'updated_at'];

protected $appends = ['next_cleaning'];

public function host()
{
    return $this->belongsTo(Host::class);
}

public function cleaners()
{
    return $this->belongsToMany(
        Cleaner::class,
        'cleaners_houses',
        'house_id',
        'cleaner_id'
    );
}

public function cleanings()
{
    return $this->hasMany(CleaningProject::class);
}

public function getNextCleaningAttribute()
{
    return $this->cleanings()->orderBy('created_at', 'desc')->first();
}
}

清洁程序:

class Cleaner extends Model
{
protected $dates = ['created_at', 'updated_at'];

public function houses()
{
    return $this->belongsToMany(
        House::class,
        'cleaners_houses',
        'cleaner_id',
        'house_id'
    );
}

public function hosts()
{
    return $this->belongsToMany(
        Host::class,
        'cleaners_hosts',
        'cleaner_id',
        'host_id'
    );
}

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

public function cleanings()
{
    return $this->hasMany(CleaningProject::class);
}

public function getNameAttribute()
{
    return $this->user->name;
}

}

主机

class Host extends Model
{
protected $dates = ['created_at', 'updated_at'];

protected $appends = ['name'];

public function houses()
{
    return $this->hasMany(House::class);
}

public function cleaners()
{
    return $this->belongsToMany(
        Cleaner::class,
        'cleaners_hosts',
        'host_id',
        'cleaner_id'
    );
}

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

public function getNameAttribute()
{
    return $this->user->name;
}
}

已经创建了将许多清洁工绑定到许多房屋的迁移:

迁移

class CreateCleanersHousesTable extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('cleaners_houses', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('cleaner_id')->references('id')->on('cleaners');
        $table->integer('house_id')->references('id')->on('houses');
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('cleaners_houses');
}

}

1 个答案:

答案 0 :(得分:0)

这是我找到的解决方案:

public function hireCleanerToHouse (Request $request)
{
  $email = $request->email;
  $houseId = $request->idHouse;
  $idUserEmail = User::where('email', $email)->first();
  $cleaner = Cleaner::where('user_id', $idUserEmail->id)->first();
  $house = House::find($houseId);
  $cleaner->houses()->attach($house->id);
  return response()->json([$cleaner, $house], 200);
}

您可能会看到问题所在,因为模型Cleaner仅包含“ id”和“ user_id”,因此我必须首先获取user.id并在其中user_id = user.id的地方找到清洁器。

我也没有在attach()中传递$ house-> id来匹配关系。现在可以正常工作了。希望对别人有帮助。