Различия в использовании Model :: create между Laravel 5.4 и 5.8? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть проект, основанный на Laravel 5.8, где я храню модель из проверенной формы Request, но я не могу понять, почему мне нужно так, чтобы она работала:

public function store(CotisationRequest $request)
{
    $cotisation = new Cotisation();
    $cotisation->fill($request->except('_token'));

    if ($request->cheque) {
        $cheque     = Cheque::create($request->cheque);
        $cotisation->cheque()->associate($cheque);
    }

    $cotisation->save();

    return redirect()->route('cotisations.edit', ['cotisation' => $cotisation, 'membre' => $cotisation->membre]);
}

Существует модель def:

class Cotisation extends Model
{
    protected $table      = 'cotisations';
    public    $with       = ['cheque', 'especes'];
    public    $fillable   = [
        'membre_id', 'cheque_id', 'annee', 'speciale', 
'droits_entree',
        'cotisation','don', 'montant', 'mode_paiement', 'statut'
    ];
   ...
}

А вот и просьба:

class CotisationRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'membre_id'             => 'exists:membres,id',
            'cotisation'            => 'min:0|lte:montant',
            'don'                   => 'min:0|lte:montant',
            'droits_entree'         => 'min:0|lte:montant',
            'montant'               => 'min:0|numeric',
            'cheque.montant'        => 'required_if:mode_paiement,CHQ|gte:montant',
            'cheque.emetteur'       => 'required_if:mode_paiement,CHQ',
            'cheque.banque'         => 'required_if:mode_paiement,CHQ',
            'cheque.numero'         => 'required_if:mode_paiement,CHQ',
            'cheque.date_emission'  => 'required_if:mode_paiement,CHQ|date|before_or_equal:today',
            'annee'                 => Rule::unique('cotisations')->where(function($q) {
                return $q->where('membre_id', $this->input('membre_id'));
            }),
        ];
    }

    public function messages() {
        return [
            'membre_id.exists' => 'Le membre n° :input n\'a pas été trouvé.',

            'cotisaton.min'  => 'La cotisation minimale est de 0€.',
            'cotisation.lte' => 'La cotisation doit être inférieure ou égale au montant total indiqué.',

            'don.min' => 'Le don minimal est de 0€.',
            'don.lte' => 'Le don doit être inférieur ou égal au montant total indiqué.',

            'droits_entree.min' => 'Le droit d\'entrée minimal est de 0€.',
            'droits_entree.lte' => 'Le droit d\'entrée doit être inférieur ou égal au montant total indiqué.',

            'cheque.montant.required_if' => 'Le montant du chèque est requis.',
            'cheque.montant.gte'         => 'Le montant du chèque doit être égal ou supérieur au montant total indiqué.',

            'cheque.emetteur.required_if' => 'L\'émetteur du chèque est requis.',

            'cheque.banque.required_if' => 'La banque du chèque est requis.',
            'cheque.numero.required_if' => 'Le numéro du chèque est requis.',

            'cheque.date_emission.required_if'     => 'La date d\'émission du chèque est requis.',
            'cheque.date_emission.before_or_equal' => 'La date d\'émission du chèque doit être antérieure ou égale à aujourd\'hui.',

            'annee.unique' => 'Une cotisation est déjà définie pour l\'année :input.',
        ];
    }
}

Здесь я должен создать новый экземпляр, а затем заполнить его. Если я попытаюсь сделать то же самое способом «:: create», будут заполнены только некоторые поля, и я не могу понять, почему, так как мой заполнитель установлен правильно.

Есть идеи? Спасибо за вашу помощь (код контроллера теперь работает, но я просто хотел бы понять, в чем моя ошибка).

Ответы [ 3 ]

0 голосов
/ 10 июля 2019
//you only need:
$cotisation = Cotisation::create($request->all());

//you do not need to fill

if ($request->cheque) {
   $cheque     = Cheque::create($request->cheque);
   $cotisation->cheque()->associate($cheque);
   //place save inside of if statement since you only need to save if doing this
   $cotisation->save();
}



https://laravel.com/docs/5.8/eloquent#mass-assignment

https://laravel.com/docs/5.8/eloquent-relationships#updating-belongs-to-relationships

0 голосов
/ 11 июля 2019

Как я был глуп! все произошло из-за __construct в моей модели, который обошел метод :: create!

0 голосов
/ 10 июля 2019

Я думаю, что $ model-> fill () может сохранять отношения с массивом (relations.attribute), а не :: create

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...