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