Я пытаюсь сохранить длинные данные в базе данных. До сих пор я получаю значение формы из объекта запроса и устанавливаю его для модели базы данных. Это прекрасно работает. Но я хочу знать, есть ли другой способ эффективно инициализировать модель без необходимости устанавливать каждое значение. Моя модель имеет отношение один к одному.
Я так делал. Но я не думаю, что это правильный способ
//Student details
$studentDetail->student_first_name = $request->input('studentFirstName');
$studentDetail->student_last_name = $request->input('studentLastName');
$studentDetail->student_phone_number = $request->input('studentPhoneNumber');
$studentDetail->student_date_of_birth = $request->input('studentDOB');
$studentDetail->student_email = $request->input('studentEmail');
$studentDetail->save();
$studentAddress = new Address();
$studentAddress->address_1 = $request->input('studentAddress1');
$studentAddress->address_2 = $request->input('studentAddress2');
$studentAddress->city = $request->input('studentCity');
$studentAddress->state = $request->input('studentState');
$studentAddress->country = $request->input('studentCountry');
$studentAddress->post_code = $request->input('studentPostCode');
$studentDetail->addresses()->save($studentAddress);
$visaDetails = new Visa();
$visaDetails->passport_number = $request->input("visaPassportNumber");
$visaDetails->visa_number = $request->input("visaVisaNumber");
$visaDetails->visa_class = $request->input("visaVisaClass");
$visaDetails->visa_grant_date = $request->input("visaVisaGrantDate");
$visaDetails->visa_expiry_date = $request->input("visaVisaExpiryDate");
$studentDetail->visaDetails()->save($visaDetails);
//
$instituteDetails = new Institute();
$instituteDetails->institute_name = $request->input("instituteName");
$instituteDetails->institute_location = $request->input("instituteLocation");
$instituteDetails->institute_phone1 = $request->input("institutePhone1");
$instituteDetails->institute_phone2 = $request->input("institutePhone2");
$instituteDetails->institute_email = $request->input("instituteEmail");
// dd($instituteDetails->courses);
$courseDetails = new Course();
$courseDetails->course_level = $request->input("courseLevel");
$courseDetails->course_name = $request->input("courseName");
$courseDetails->course_fee = $request->input("courseFee");
$courseDetails->course_concession_fee = $request->input("courseConcessionFee");
$courseDetails->course_duration = $request->input("courseDuration");
$courseDetails->course_commencement_date = $request->input("courseCommencementDate");
$studentDetail->instituteDetails()->save($instituteDetails);
$instituteDetails->courses()->save($courseDetails);
Есть идеи по ускорению этого процесса ??






Просто настройте создание своих моделей с использованием массового назначения, поэтому:
Итак, в вашей модели СтудентПодробнее:
class StudentDetail{
protected $fillable = [
'student_first_name',
'student_last_name',
'student_phone_number',
'student_date_of_birth',
'student_email',
];
//...
//... rest of your model
}
Затем настройте свои входы HTML, чтобы в их имена был пользовательский массив, например, так:
<input type = "text" id = "foo" name = "student[student_first_name]">
<input type = "text" id = "foo" name = "student[student_last_name]">
.....
Кончик: для проверки, вы должны обрабатывать его с помощью точечной нотации, поэтому ваше правило может быть таким:
'student.student_first_name' => 'required|humanName|string|max:255',
Теперь просто сделайте следующее в своем контроллере:
$studentDetail = StudentDetail::create($request->input('student'));
Теперь вы сделали то же самое для своего адрес и других моделей.
GIST: После включения массового назначения для ваших моделей у вас может получиться ТОЛЬКО, следующая пара строк кода сделает все это за вас, и это будет намного веселее и полнее динамизма;) ИМХО!
$relatedModels = ['Address', 'Visa', 'Institute', 'Course'];
foreach ($relatedModels as $relatedModel) {
$relatedModelClass = 'App\\'.$relatedModel; //adjust the namespace of your models here.
$ormRelatedModel = $relatedModelClass::create(strtolower($request->input($relatedModel)));
$studentDetail->{strtolower(str_plural($relatedModel)) . 'Details'}()->save($ormRelatedModel);
}
обратите внимание, что в этом случае имена ваших отношений должны быть немного изменены, как функция addresses в вашем классе / модели StudentDetail должна быть изменена на addressDetails или просто удалите .'Details' из моего примера кода выше и удалите его из других имен ваших отношений, то есть: изменить instituteDetails() в institute(). и сделайте имена отношений множественным числом, пожалуйста!
Я только что протестировал, и он работает, Ваше здоровье!
Спасибо, Мохаммад, за ответ. Я немного запутался при установке отношения один к одному с помощью этого метода. Метод create устанавливает значение непосредственно в базу данных. Я не мог прикрепить модели друг к другу.
Добро пожаловать :), и на самом деле то, что я вам написал, - это комплексное решение. просто установите для ваших моделей / HTML входные данные в качестве примера. и поверьте, это выиграет у вас много времени;)
Чтобы помочь вам в отношении самого отношения, forexanple UserDetails + Address, у вас должен быть address_id на вкладке UserDetails, я думаю, это user_details, тогда в модели UserDetails, которую вы должны иметь, public function addresses(){ return $this->belongTo(Address::class);}, обратите внимание, что имя этой функции должно быть в единственном числе! Я нарушил условность здесь, чтобы он соответствовал динамизму, который я добавил выше;) Удачи, братан!
Вы можете проверить это и это, чтобы получить представление.