Laravel - Отправка сообщения в блоге без отображения в базе данных? - PullRequest
0 голосов
/ 20 марта 2020

Поскольку я до сих пор учусь и люблю это, я достиг другого камня преткновения. На моей странице блога у меня есть простая настройка формы с именем и телом. Когда я отправляю заполненную форму, она сбрасывает форму, как будто она была передана в базу данных. Но это было не так. Когда я ссылаюсь sh MySQL, ничего не происходит. Однако, если я передаю тестовые данные на MySQL, они проходят без проблем. (Стек: Laravel, PHP, MySQL, HTML / CSS, TailWind CSS)

Мой вопрос: когда я отправляю сообщение в блоге, как я могу убедиться, что оно было передано MySQL база данных?

Blog Controller

<?php

namespace App\Http\Controllers;

use App\Blog;
use Illuminate\Http\Request;

class BlogController extends Controller
{
    public function index()
    {
        $blogs = \App\Blog::all();

        return view ('blog.index', compact('blogs'));

    }

    public function store()
    {
        $data = request()->validate([
            'title' => 'required|min:5',
            'blog' => 'required'
        ]);

        \App\Blog::create($data);

       return redirect()->back();

    }

    public function create()
    {
        $blogs = \App\Blog::all();

        return view ('blog.create', compact('blogs'));
    }

    public function show()
    {
        return view('blog.index');
    }
}


Таблица миграции

<?php

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

class CreatesBlogsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('body');
            $table->timestamps();

        });
    }

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

Маршруты


use App\Mail\WelcomeMail;

Route::get('/email', function() {
    return new WelcomeMail();
});

Route::get('/home', 'HomeController@index');
Route::get('/about', 'HomeController@about');
Route::get('/contact', 'HomeController@contact');

Route::get('/blog', 'BlogController@index');
Route::get('/blog/create', 'BlogController@create');
Route::get('/blog/{blog}', 'BlogController@show');
Route::post('/blog', 'BlogController@store');

Приложение \ Блог

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected $guarded = [];
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Из кода вашего контроллера мы видим, что ваша форма передает (как минимум) 2 поля, title и blog:

$data = request()->validate([
    'title' => 'required|min:5',
    'blog' => 'required'
]);

Хотя проверка вашей миграции отсутствует, blog поле в вашей таблице:

$table->bigIncrements('id');
$table->string('title');
$table->string('body');
$table->timestamps();

Похоже, что поле blog в форме и в коде вашего контроллера действительно должно быть body - или, наоборот, миграция должна создать * Поле 1012 *.

В любом случае ваш контроллер пытается create() запись, используя title и blog, но не body.

Миграция указывает, что ни title, ни body не могут быть нулевыми ( вы бы использовали ->nullable(), чтобы разрешить это), а также не указывает значение по умолчанию для этих полей ( вы бы использовали ->default('foo') для этого). Таким образом, если вы попытаетесь создать запись, в которой отсутствует значение для поля body, которое не может быть пустым и не имеет значения по умолчанию, MySQL завершится неудачей.

Как упоминалось в другой ответ, убедитесь, что ваше массовое задание настроено правильно, чтобы можно было заполнить title и body (или blog!).

1 голос
/ 20 марта 2020

В модели необходимо указать атрибут fillable или guarded, так как все модели Eloquent по умолчанию защищают от массового назначения. Добавьте следующий атрибут в класс App\Blog:

protected $fillable = ['title', 'blog'];

Источник и примеры

Отвечая на вопрос: Laravel выдает исключение, если не удается сохранить модель для базы данных. В этом случае конечная точка POST /blog добавляет запись в файл журнала (storage/logs/laravel.log) и возвращает ответ со статусом 503 (ошибка сервера). Проверьте код внешнего интерфейса, чтобы узнать, обрабатывает ли он ответы об ошибках или просто игнорирует их.

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