user7956165
user7956165

Reputation:

Select and update table columns without ID in laravel

I'm trying to make page in admin panel from where the admin can change site settings such as: site title, default country etc.

I've created table in database called settings without ID because I don't really need it. It will be only one row which will be updated. No inserts of new rows.

I have add this lines in my route.php

Route::get('settings', 'SettingsController@index')->name('admin.settings');
Route::post('settings/update', 'SettingsController@update')->name('admin.settings.update');

This is my update function in SettingsController.php

public function index()
{
    $settings = Settings::all();
    return view('backend.settings',compact('settings'));
}
public function update( Request $request)
{

    $settings->settings_site_title = $request['site_title'];
    $settings->settings_item_per_page = $request['item_per_page'];
    $settings->settings_default_country = $request['default_country'];
    $settings->settings_max_image_post = $request['max_image_post'];
    $settings->save();

    return redirect()->route('admin.settings')->with('alert-success', ' Success');
}

and the form

 @foreach ($settings as $preferences)
     {!! Form::open(['route' => 'admin.settings.update','files' => true , 'class' =>'form-horizontal']) !!}

              <div class="form-group">
                 {!! Form::label('site_title', 'Site Name', array('class'=> 'col-sm-2 control-label')) !!}
                  <div class="col-sm-10">
                   {!! Form::text('site_title', $preferences->settings_site_title, ['class'=>'form-control', 'placeholder'=>'Enter site name', 'id'=>'site_title']) !!}
                  </div>
                </div>

      ... some more inputs like ^

     {!! Form::close() !!}
 @endforeach

When I submit the form I've got this error:

Creating default object from empty value

Update: Model

class Settings extends Model
{
    protected $table = 'settings';
    public $timestamps = false;

    protected $fillable = [
        'settings_site_title',
        'settings_item_per_page',
        'settings_default_country',
        'settings_max_image_post',
    ];

}

Controller

public function update( Request $request)
{
    $settings = Settings::first(); //missed line
    $settings->settings_site_title = $request['site_title'];
    $settings->settings_item_per_page = $request['item_per_page'];
    $settings->settings_default_country = $request['default_country'];
    $settings->settings_max_image_post = $request['max_image_post'];
    $settings->save();

    return redirect()->route('admin.settings')->with('alert-success', ' Success');
}

Upvotes: 3

Views: 8817

Answers (2)

huuuk
huuuk

Reputation: 4795

You have forgot to set $settings variable in update method

public function update( Request $request)
{
    $settings = Settings::first(); //missed line
    $settings->settings_site_title = $request['site_title'];
    $settings->settings_item_per_page = $request['item_per_page'];
    $settings->settings_default_country = $request['default_country'];
    $settings->settings_max_image_post = $request['max_image_post'];
    $settings->save();

    return redirect()->route('admin.settings')->with('alert-success', ' Success');
}

or even better and shorter

public function update( Request $request)
{
    $settings = Settings::first()->update($request->all());

    return redirect()->route('admin.settings')->with('alert-success', ' Success');
}

of course this will work only if you fill fillable property of Settingsmodel with columns you need to mass assign.

class Settings extends Model
{
    // ...
    protected $fillable = [
        'site_title',
        'item_per_page',
        'default_country',
        'max_image_post',
    ];
    // ...
}

Edit

Try this

public function update( Request $request)
{
    $settings = Settings::first(); //missed line
    $settings->settings_site_title = $request->input('site_title');
    $settings->settings_item_per_page = $request->input('item_per_page');
    $settings->settings_default_country = $request->input('default_country');
    $settings->settings_max_image_post = $request->input('max_image_post');
    $settings->save();

    return redirect()->route('admin.settings')->with('alert-success', ' Success');
}

Edit

add this to your Settings model

protected $primaryKey = null;
public $incrementing = false;

Upvotes: 2

Nithin John
Nithin John

Reputation: 917

if(count($settings)>0){

}

Use this if condition before foreach. I think the $setting variable is empty.

Upvotes: 0

Related Questions