Вставить в таблицу отношений многих ко многим в Laravel - PullRequest
0 голосов
/ 14 января 2019

В моем проекте laravel у меня есть таблицы, в которые я хочу вставить отношения многие ко многим между двумя из них. Я хочу связать пользователя (который должен быть более чистым) с одним домом из множества аутентифицированных пользователей текущего хоста. Для этого я реализую в контроллере следующую функцию:

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 голосов
/ 14 января 2019

вот решение, которое я нашел:

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

Как вы можете видеть, проблема заключалась в том, что очиститель модели содержит только 'id' и 'user_id', поэтому мне пришлось сначала получить user.id и найти очиститель, где user_id = user.id.

Также я не передал $ house-> id в attach (), чтобы соответствовать отношениям. Сейчас работает нормально. надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...