#laravel #eloquent #php-carbon
#laravel #красноречивый #php-carbon
Вопрос:
У меня есть класс с именем SubjectData:
class SubjectData extends Model
{
protected $table = 'subject_datas';
protected $fillable = ['firstname','lastname','birthdate','birthcity','months'];
protected $dates = ['birthdate'];
public function setBirthdateAttribute($date)
{
// So we can add the time, not just he php date
$this->attributes['birthdate'] = Carbon::createFromFormat('d/m/Y', $date);
}
public function anamnesis() {
return $this->belongsTo('AppAnamnesis');
}
}
И у меня есть класс под названием Anamnesis:
class Anamnesis extends Model
{
public function meetingTest() {
return $this->belongsTo('AppMeetingTest');
}
public function subject() {
return $this->belongsTo('AppSubject','subject_id','id');
}
public function subjectData() {
return $this->hasOne('AppSubjectData');
}
public function scholarHistory() {
return $this->hasOne('AppScholarHistory');
}
public function familyHistory() {
return $this->hasOne('AppFamilyHistory');
}
public function psicodiagnosis() {
return $this->hasOne('AppPsicodiagnosis');
}
}
Функция сохранения класса SubjectController работает следующим образом:
public function store(CreateSubjectRequest $request)
{
$input = $request->all();
// Let's generate the anamnesis of the subject
$anamnesis = Anamnesis::create();
$anamnesis->save();
$newSubjectData = $this->saveSubjectData($input);
$anamnesis->subjectData()->save($newSubjectData);
......
......
}
где вызываемая функция:
public function saveSubjectData($input)
{
$subjectData['firstname'] = $input['firstname'];
$subjectData['lastname'] = $input['lastname'];
$subjectData['birthcity'] = $input['birthcity'];
$subjectData['birthdate'] = $input['birthdate'];
return SubjectData::create($subjectData);
}
Проблема связана со свойством «дата рождения».
Если я проверю значение $newSubjectData (dd($newSubjectdata)) после вызова $this-> saveSubjectData($input), значение даты рождения будет точно таким, какое я установил в календаре на лицевой стороне (а также в базе данных значение правильное)
Если я помещу dd($anamnesis-> subjectData) после вызова $anamnesis->subjectData()-> save($newSubjectData), результатом будет дата «сегодня», а также в БД значение будет не тем, которое я установил, а сегодняшней датой.
Я не могу найти ошибку
PS Календарь находится внутри шаблона Vue
Ответ №1:
Я думаю, проблема в том, что дата должна быть экземпляром Carbon или правильно отформатирована в соответствии с таблицей вашей базы данных. Попробуйте выполнить следующее в вашем методе saveSubjectData()
$subjectData['birthdate'] = CarbonCarbon::parse($input['birthdate']
Комментарии:
1. Дело в том, что пока я не доберусь до команды $anamnesis->subjectData()->save($newSubjectData), дата корректно сохраняется в БД. Это связано с тем, что я установил свойство типа $dates внутри модели. Даже без выполнения команды CarbonCarbon:formatFrom … это работает.. Только когда я пытаюсь подключить его к анамнезу, кажется, что дата сбрасывается.
2. Я понимаю. Попробуйте это, прежде чем использовать
save()
:$anamnesis->subjectData()->attach($newSubjectData);
3. Вызов неопределенного метода IlluminateDatabaseQueryBuilder::attach()
4. Извините, что я не понял, что вы используете hasOne. В любом случае, я покопался в Laravel и обнаружил, что метод save устанавливает внешний идентификатор модели, которую вы передали (в вашем случае SubjectData). Затем
save()
метод модели обновляет атрибуты модели, включая временные метки. Я думаю, решение состоит в том, чтобы использовать$anamnesis->subject_data_id = $newSubjectData->id
, а затем сохранить его$anamnesis->save()
5. Я написал ответ ниже
Ответ №2:
Я записываю ответ, но благодарю Джона Олдрина, который направил меня в правильном направлении.
Вы должны поместить временную метку (‘birthdate’) ПОСЛЕ временных меток по умолчанию в таблице миграции (таким образом, в конце таблицы миграции)
Я не знаю почему. Если кто-то знает, пожалуйста, объясните!
Комментарии:
1. Это странно o_O У меня есть таблица с именем events, и моя миграция
$table->timestamp('wouldbe_on'); $table->timestamps(); $table->softDeletes();
в любом случае, здорово, что вы решили ее самостоятельно 🙂