#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 становится частью модели.
(Не забудьте также изменить другую строку в вашем конструкторе, где вы присваиваете значение объекту)