Хранить отношения, принадлежащие множеству, с условиями — Laravel

#laravel #eloquent

#laravel #красноречивый

Вопрос:

У меня есть следующие таблицы для моих отношений «многие ко многим»: soldhomestests , tasks и soldhomestest_task (в качестве стержня).

Моя таблица soldhomestestes уже заполнена данными. Как мне заставить мою сводную таблицу soldhomestest_task заполняться данными при создании новой задачи, которая соответствует условиям в моей таблице soldhomestest? В моем примере я хочу сохранить данные об отношениях при выполнении следующих условий:

 'tasks.city' = 'soldhomestests.city'
'tasks.address' = 'soldhomestests.address'
  

Кажется, я не могу найти никакой документации о том, как поступить с этим?

Модели:

 class Task extends Model
{
    protected $fillable = [
        'address', 'city', 'state',
    ];

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

    public function soldhomestests()
    {
        return $this->belongsToMany('AppSoldhomestest');
    }
}

class Soldhomestest extends Model
{

    public function tasks()
    {
        return $this->belongsToMany('AppTask');
    }
}
  

КОНТРОЛЛЕР:

   public function store(Request $request)
    {
        $this->validate($request, [
            'address' => 'required|max:255',
            'city' => 'required|max:255',
            'state' => 'required|max:255',
        ]);

        $request->user()->tasks()->create([
            'address' => $request->address,
            'city' => $request->city,
            'state' => $request->state,
        ]);

        return redirect()->route('settings.index');
    }
  

Комментарии:

1. Вы могли бы использовать события Eloquent. laravel.com/docs/master/eloquent#events

Ответ №1:

Не верьте, что это способ Laravel, но я изменил свой контроллер, чтобы создать массив идентификаторов, используя условие where:

 public function store(Request $request)
    {
        $this->validate($request, [
            'address' => 'required|max:255',
            'city' => 'required|max:255',
            'state' => 'required|max:255',
        ]);

        $newtask = $request->user()->tasks()->create([
            'address' => $request->address,
            'city' => $request->city,
            'state' => $request->state,
        ]);

        $condition = DB::table('soldhomestests')->where([
            ['soldhomestests.address', '=', $request->address],
            ['soldhomestests.city', '=', $request->city],
          ])->pluck('id');

        $lastid = $newtask->id;
        $tasksoldhome = Task::find($lastid);
        $tasksoldhome->soldhomestests()->sync($condition);

        return redirect()->route('settings.index');
    }
  

Ответ №2:

Используя eloquent, вы можете сделать это таким образом.

 $task=new Task();
$task->city=$request->city;
$task->address=$request->address;
$task->save();

$soldhometests=Soldhometest::all();
foreach($soldhometests as $soldhometest)
{
    if($task->city==$soldhometest->city amp;amp; $task->address==$soldhometest->address)
    {     
          $soldhometest_task=new SoldhometestTask();  // pivot model
          $soldhometest_task->task_id=$task->id;
          $soldhometest_task->soldhometest_id=$soldhometest->id;
          $soldhometest_task->save();
     }
}