Brad_Fresh
Brad_Fresh

Reputation: 119

How to get this code work to store in Laravel. No errors and no storage

I can't store name and IP address to DB. I created a table 'info' with appropriate fields by running php artisan migrate.

A schema

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

A model for Info

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

Maybe the problem is in my HomeController where I get those variables?

<?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');
  }
 }
}

My routes in web.php

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

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

});

But it doesn't work. Gives no errors and no records in DB.

Something make me think that it have to do with my index function. I got info in function index and maybe function store doesn't have a clue what I mean.

Upvotes: 0

Views: 871

Answers (3)

mdexp
mdexp

Reputation: 3567

A controller action is basically a method that usually gets executed when you open an url (as you connect them to routes).

In your example you have connected two routes to their respective actions:

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

Now, when you log in succesfully, imagine that you end up in the page with url http://localhost:8000/home in your web browser.

The key difference is the method which you use to call your route (you can get an overview of the differences here), in your case you are using GET method.

The resulting action executed it the one associated to /home route with the GET method, that is the HomeController@index action (or method).

The store method, although is in the same HomeController class, doesn't get triggered unless you execute the /home route, but with the POST method.

You can confirm that if you put a debug message in each of the methods like this:

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';
    }
}

If you want to simply save a info record when you visit the /home route with the GET method, you can put the save in the index method itself and get rid of the store method:

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

Keep in mind that doing in this way you will get a new database record for each page view you make to that route (if you keep refreshing the page, you should see new records being added to database).

Update

When you use Eloquent Models, laravel will look for a table named after the pluralized model name (Info model will try to use infos table).

However you created a table named info. To solve that you can either rename the table and rerun the migration with php artisan migrate:refresh (it will delete all the existing data in the database you are using for your laravel app)

Or specify the table name to use for that laravel model:

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

Upvotes: 2

sn n
sn n

Reputation: 399

Within your store function inside HomeController , use

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

and make sure Info model is imported. Also make sure your route has the call to store function while POSTing data .

Upvotes: 0

Jason
Jason

Reputation: 3040

How are you calling the functions? There is a couple of things wrong with your code, but you're saying there are no errors at all.

Firstly, your Info::create call does not need the ['info' => $request->input('info')] info. This is because your Info model has no database property called info, but normally you would get an obvious error with the approach, which is why I expect you are also calling the store method incorrectly.

Call the create method like so:

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

or, if you can guarantee your $request only contains the needed fields (properly validated), you can just do

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

Add a little more info to the question on how you are calling store and we can probably solve the rest of your problem.

Upvotes: 0

Related Questions