Laravel model save() сохранит дублированные данные в db

Я написал код, изучив видеоурок по php/laravel. но результат не тот. шаг проблемы:

  1. создайте таблицу БД с именем Questions и модель с именем Question.
  2. добавить функцию для сохранения данных в БД.
  3. в этой функции используйте следующий код:

    use Illuminate\Database\Eloquent\Model;
    
    class Question extends Model
    {
        public function add_question(){
            $this->title = rq('title');
            $this->user_id = session('user_id');
            if (rq('description'))
                $this->desc = rq('description');
            $result = $this->save();
            //dump($result);
            return( $result)?
                 ['status'=> '1' , 'id'=>$this->id] :
                 ['status'=> '0' , 'message'=>'db save fail'];
        }
    }
    
  4. запустить в браузере http://localhost/api/question/add?title=rrrrr&description=tttttt и проверь бд, будет две одинаковые записи. как ниже:

    id  title   descdescription  user_id    status  created_at       updated_at
    12  rrrrr   tttttt           18         ok      2019/4/7 16:55   2019/4/7 16:55
    13  rrrrr   tttttt           18         ok      2019/4/7 16:55   2019/4/7 16:55
    

    это не тот результат, что в видеоуроке.

  5. если я раскомментирую дамп ($ результат); , он нормально вставит 1 запись.

Я использую wampserver для Windows, версия PHP 7.3.1. Я новичок в PHP. Так что не знаю в чем проблема.

rq() находится в web.php

function rq($key=null, $default=null){
    if (!$key)return Request::all();
    return Request::get($key,$default);
}

    function question_ins(){
        return new App\Question;
    }

    Route::any('api/question/add', function () {

        return(question_ins()->add_question());
    });

Не могли бы вы предоставить больше контекста о том, где используются эти условные выражения?

mdexp 07.04.2019 19:35

привет mdexp, я добавляю целую функцию. пожалуйста, взгляните. Спасибо

J.S 07.04.2019 19:42

Не могли бы вы предоставить действие контроллера или закрытие/функцию маршрута (если она у вас есть), которая вызывает метод add_question. Тернарный оператор (с использованием ? и :) аналогичен условному оператору (с использованием if и else) с точки зрения программирования, поэтому ваш код будет работать одинаково в обоих случаях. Также, где определена функция rq()? Учебное пособие, которому вы следуете, похоже, не поможет вам сделать все правильно, потому что в целом метод add_question не должен быть частью вашего класса модели.

Bogdan 07.04.2019 19:55

привет Богдан, ты прав, я снова тестирую и нахожу разницу. пожалуйста, проверьте обновленный вопрос. Будет ли это связано с браузером? Но я проверяю это с помощью ie и chrome, у обоих такая же проблема.

J.S 07.04.2019 20:17

OMG, он действует по-разному в разных браузерах. Проверяю Мозилой, этого не будет, почему?

J.S 07.04.2019 20:23

если я добавлю «dump($result);», он может работать правильно на ie и chrome, но независимо от того, добавляю dump() или нет, он может хорошо работать на Mozilla. Кто-нибудь знает, в чем проблема?

J.S 07.04.2019 20:26

Не могли бы вы предоставить ссылку на учебник, который вы следуете.

Bogdan 07.04.2019 20:30

извините, это китайский сайт, и это платное видео. код тот же, но учитель использует компьютер Mac.

J.S 08.04.2019 04:09

Добро пожаловать JS в Stack Overflow! Как отметил @Bogdan, есть подозрение, что ваш учебник не направляет вас по правильному пути. Я рекомендую прочитать о приложениях CRUD и RESTful.

FullStackOfPancakes 08.04.2019 04:32

Что касается вашего вопроса, Документы Laravel по вставке и обновлению моделей Eloquent должен помочь вам здесь.

FullStackOfPancakes 08.04.2019 04:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
1 779
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

create a db table named questions and a model named Question.

Прочтите об определении моделей здесь

Из вашего интерфейса командной строки:

php artisan make:model Question --migration

Отредактируйте модель вопроса:

<?php 

namespace App;

use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
    // Just tweak this for whatever your Model looks like 
    protected $fillable = [
        'subject',
        'body',
        'author'
    ];

}

Отредактируйте миграцию create_questions_table:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateQuestionsTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('questions', function (Blueprint $table) {
            $table->increments('id');
            $table->string('body');
            $table->string('subject');
            $table->string('author');
            $table->timestamps();
        });
     }


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('questions');
    }

}

Из вашего CLI запустите php artisan migrate

add a function to save data into db.

Ознакомьтесь с Документы Laravel о контроллерах и о том, что вы можете с ними делать.

Снова из вашего CLI:

php artisan make:controller QuestionController

ВопросКонтроллер:

<?php

namespace App\Http\Controllers;
use App\Question;
use Illuminate\Http\Request;

class QuestionController extends Controller {

    public function store( Request $request )
    {

        // Create a new instance of your Question Model
        //modify input param .
        $question = App\Question::firstOrNew([
            'body' => $request->body,
            'subject' => $request->subject,
            'author' => $request->author
        ]);

        // Then save it to the database
        $question->save();

        return back()->with('success', 'Question posted');

    }

}

Вопрос.blade.php

<form method = "POST" action = "/question">
    @csrf 
    <input type = "text" name = "body" id = "body" class = "form-control">
    <input type = "text" name = "subject" id = "subject" class = "form-control">
    <input type = "text" name = "author" id = "author" class = "form-control">
    <button class = "btn btn-primary">Ask Question</button>
</form>

@if ( session('success') )
    <div class = "alert alert-success">
        <h3>Question asked!</h3>
    </div>
@endif 

Маршруты/web.php

Route::post('/question', QuestionController@store)->name('ask-question');

привет, спасибо за вашу помощь, я следую вашей инструкции. это работает хорошо.

J.S 08.04.2019 18:27

привет, @UkraineInTheMembrane, правильно ли я изменил входной параметр firstOrNew() на следующий: $question = Question::firstOrNew(['body' => $request->body, 'subject' => $request->subject , 'автор' => $request->author] ); Я получил ошибку вставки БД, используя ваш код. после его изменения. он хорошо вставляет БД.

J.S 08.04.2019 18:48

Конечно @JS! Это была моя ошибка - я отредактирую свой ответ. Вы можете прочитать больше здесь об использовании Eloquent для вставки/создания записей.

FullStackOfPancakes 08.04.2019 18:56

Привет, @JS - если это решило твою проблему, не мог бы ты принять ответ? Очень признателен!

FullStackOfPancakes 08.04.2019 22:59

Другие вопросы по теме