Атрибуты модели Laravel равны нулю, когда я ее сохранил, но, но я проверил их в конструкторе

#php #laravel

#php #ларавель

Вопрос:

работая с Laravel PHP, у меня есть эта модель с конструктором, в котором я устанавливаю атрибуты:

 class NutritionalPlanRow extends Model
{
    use HasFactory;

    private $nutritional_plan_id;
    private $aliment_id;
    private $nomeAlimento;

    public function __construct($plan = null,
                                $aliment = null,
                                array $attributes = array())  {

        parent::__construct($attributes);

        if($plan){
            $this->nutritional_plan()->associate($plan);
            $this->nutritional_plan_id = $plan->id;
        }
        if($aliment){
            $this->aliment()->associate($aliment);
            $this->aliment_id = $aliment->id;
            $this->nomeAlimento = $aliment->nome;
        }

    }

    /**
     * Get the plan that owns the row.
     */
    public function nutritional_plan()
    {
        return $this->belongsTo('AppModelsNutritionalPlan');
    }

    /**
     * Get the aliment record associated with the NutritionalPlanRow.
     */
    public function aliment()
    {
        return $this->belongsTo('AppModelsAliment');
    }

    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

    /**
     * Get the value of nomeAlimento
     */
    public function getNomeAlimentoAttribute()
    {
        return $this->nomeAlimento;
    }

    /**
     * Get the value of plan_id
     */
    public function getNutritional_Plan_IdAttribute()
    {
        return $this->nutritional_plan_id;
    }

    /**
     * Get the value of aliment_id
     */
    public function getAliment_IdAttribute()
    {
        return $this->aliment_id;
    }
}
 

Затем у меня есть контроллер, где я инициализирую объект:

 public function addAlimentToPlan(Request $request){

        $planId = $request->planId;
        $alimentId = $request->alimentId;

        $validatedData = Validator::make($request->all(), [
        'planId' => ['required'],
        'alimentId' => ['required'],
    ]);

    if ($validatedData->fails()) {
        return back()->withErrors($validatedData, 'aliment');
    }

    $plan = NutritionalPlan::find($planId);
    $aliment = Aliment::find($alimentId);

    $nutritionalPlanRow = new NutritionalPlanRow($plan, $aliment);

    Log::info('Nome Alimento '.$nutritionalPlanRow->getNomeAlimentoAttribute());

    $nutritionalPlanRow->save(); //

    Toastr::success( 'Alimento aggiunto', '',
        ["positionClass" => "toast-bottom-right",
        "closeButton" => "true"]);

    return back();
}
 

Операция сохранения возвращает эту ошибку:
SQLSTATE[23502]: Not null нарушение: ошибка 7: нулевое значение в столбце «nomeAlimento» отношения «nutritional_plan_rows»

но при регистрации $nutritionalPlanRow->getNomeAlimentoAttribute() атрибут улучшается.

Кто-нибудь может мне помочь? Спасибо.

Ответ №1:

В вашем конструкторе у вас есть следующая строка:

 $this->nomeAlimento = $aliment->nome;
 

Вы полагаете, что это заполнит атрибут в модели eloquent, но этого не происходит. Обычно такое назначение передает магический __set метод модели, но не во время построения модели / объекта.

На самом деле вы присваиваете его свойству объекта, которое позже доступно вашей функции log, но eloquent об этом не знает. Поэтому он не отправляется в базу данных, что приводит к нулевой ошибке (нет значения по умолчанию).

Вы можете использовать следующее для установки значений в конструкторе:

 $this->setAttribute('nomeAlimento', $aliment->nome);
 

Это вызывает функцию setAttribute в модели eloquent, атрибут this становится частью модели.

(Не забудьте также изменить другую строку в вашем конструкторе, где вы присваиваете значение объекту)