Как заставить этот код работать для хранения в Laravel.Нет ошибок и нет памяти - PullRequest
0 голосов
/ 22 сентября 2019

Я не могу сохранить имя и IP-адрес в БД.Я создал таблицу 'info' с соответствующими полями, запустив php artisan migrate.

Схема

 Schema::create('info', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('ip');
    $table->timestamp('created_at')->nullable();
 });

Модель для Info

class Info extends Model
  {
   protected $fillable = ['ip', 'name']; 
  } 

Возможно, проблема в том,в моем HomeController, где я получаю эти переменные?

<?php
 namespace App\Http\Controllers;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use App\Info;
 use App\Http\Controllers\Controller;
 use Illuminate\Support\Facades\Auth;
 use Request;

class HomeController extends Controller
  {
     public function __construct()
   {
    $this->middleware('auth');
   }

public function store(Request $request) {
    Info::create(['info' => $request->input('info')]);
}


public function index()
  {
    if (Auth::check())
  {
    $name = Auth::user()->name;
    $ip = Request::ip();

  \App\Events\eventIp::dispatch($ip,$name);
  return view('home');
  }
 }
}

Мои маршруты в web.php

Route::post('/home','HomeController@store');

Route::get('/home', 'HomeController@index')->name('home');

});

Но это не работает.Не выдает ошибок и записей в БД.

Что-то заставляет меня думать, что это связано с моей индексной функцией.Я получил информацию в индексе функций, и, возможно, в магазине функций нет понятия, что я имею в виду.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2019

Действие контроллера - это в основном метод, который обычно выполняется при открытии URL-адреса (когда вы подключаете их к маршрутам).

В вашем примере вы связали два маршрута с их соответствующими действиями:

Route::post('/home','HomeController@store');
Route::get('/home', 'HomeController@index')->name('home');

Теперь, когда вы успешно вошли в систему, представьте, что вы попали на страницу с URL-адресом http://localhost:8000/home в своем веб-браузере.

Ключевым отличием является метод, который вы используете для вызова вашегоroute (вы можете получить обзор различий здесь ), в вашем случае вы используете метод GET.

Результирующее действие выполнит его, связанное с /home route с GETметод, то есть действие (или метод) HomeController@index.

Метод store, хотя и находится в том же классе HomeController, не запускается, пока вы не выполните маршрут /home, но с помощью метода POST .

Вы можете подтвердить это, если поместите отладочное сообщение в каждый из методов следующим образом:

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function store(Request $request)
    {
        echo 'I will not be executed';
    }

    public function index()
    {
        echo 'I have been executed';
    }
}

Если вы хотите просто сохранить инфо-записькогда ты виСидя на маршруте /home с методом GET, вы можете поместить сохранение в сам метод index и избавиться от метода store:

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        // You can omit Auth::check() because you are using the auth middleware
        // that exactly does this job.
        Info::create([
            'name' => Auth::user()->name,
            'ip' => Request::ip(),
        ]);

        return view('home');
    }
}

Имейте в виду, что, выполнив таким образом, вы получитеновая запись базы данных для каждого просмотра страницы, который вы делаете для этого маршрута (если вы продолжаете обновлять страницу, вы должны увидеть новые записи, добавляемые в базу данных).

Обновление

Когда вы используете Eloquent Models,laravel будет искать таблицу, названную в честь множественного имени модели (модель Info попытается использовать таблицу infos).

Однако вы создали таблицу с именем info.Чтобы решить, что вы можете либо переименовать таблицу и перезапустить миграцию с помощью php artisan migrate:refresh ( он удалит все существующие данные в базе данных, которую вы используете для приложения laravel )

Или укажитеимя таблицы для этой модели Laravel:

class Info extends Model
{
    protected $table = 'info';
    protected $fillable = ['ip', 'name'];
}
0 голосов
/ 22 сентября 2019

В функции вашего магазина внутри HomeController используйте

Info::create([
            'name' => Auth::user()->name,
            'ip' => Request::ip(),
        ]);

и убедитесь, что инфо-модель импортирована.Также убедитесь, что на вашем маршруте есть вызов для сохранения функции во время размещения данных.

0 голосов
/ 22 сентября 2019

Как вы вызываете функции?В вашем коде есть пара ошибок, но вы говорите, что ошибок вообще нет.

Во-первых, ваш вызов Info::create не нуждается в информации ['info' => $request->input('info')].Это связано с тем, что в вашей модели Info отсутствует свойство базы данных с именем info, но обычно вы получаете очевидную ошибку при подходе, поэтому я ожидаю, что вы также неправильно вызываете метод store.

Вызовите createметод, подобный так:

$infoModel = Info::create(['name' => $request->input('name'), 'ip' => $request->input['ip']]);

или, если вы можете гарантировать, что ваш $request содержит только необходимые поля (должным образом проверенные), вы можете просто сделать

$infoModel = Info::create($request->all());

Добавьте еще немного информации к вопросу о том, как вы звоните store, и мы, вероятно, сможем решить остальную часть вашей проблемы.

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