Ошибка сохранения углерода Laravel «один ко многим»

#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(); в любом случае, здорово, что вы решили ее самостоятельно 🙂