Praca z Lavel Php, mam ten model z konstruktorem, gdzie ustawiam atrybuty:

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('App\Models\NutritionalPlan');
    }

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

    /**
     * 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;
    }
}

Wtedy mam kontroler, w którym zainicjowałem obiekt:

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();
}

Operacja Zapisz Zwraca ten błąd: Sqlstate [23502]: Nie luźne naruszenie: 7 errora: wartość NULL w kolumnie "Nomealimento" relacji "Nutritional_plan_Rows"

Ale rejestrowanie $ odżywiania planez-> atrybut getnomealimento () atrybut jest ulepszony.

Ktoś może mi pomóc? Dziękuję Ci.

0
Kobazzo 21 listopad 2020, 19:43

1 odpowiedź

Najlepsza odpowiedź

W konstruktorze masz następującą linię:

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

Wierzysz, że to wypełni atrybut w modelu elokwatnym, ale to się nie dzieje. Zwykle taki przypisanie przejdzie metodę magiczną __set na modelu, ale nie podczas budowy modelu / obiektu.

Faktycznie przypisujesz go do nieruchomości na obiekcie, który jest później dostępny przez funkcję dziennika, ale elokwentka nie wie o tym. Dlatego nie jest wysyłane do bazy danych, co skutkuje błędem NULL (brak wartości domyślnej).

Możesz użyć poniższych, aby ustawić wartości w konstruktorze:

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

Wytwarza to funkcję SetatTribuute w modelu elokwatowym, atrybut staje się częścią modelu.

(Upewnij się, że zmieniaj także drugą linię w konstruktorze, w którym przypisujesz wartość do obiektu)

1
Maarten Veerman 21 listopad 2020, 17:05