【问题标题】:Select and update table columns without ID in laravel在laravel中选择和更新没有ID的表列
【发布时间】:2017-05-17 10:31:15
【问题描述】:

我正在尝试在管理面板中创建页面,管理员可以从中更改站点设置,例如:site titledefault country 等。

我已经在名为settings 的数据库中创建了没有 ID 的表,因为我真的不需要它。它将只有一行将被更新。不插入新行。

我已经在我的 route.php 中添加了这一行

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

这是我在 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');
}

和表格

 @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

当我提交表单时出现此错误:

从空值创建默认对象

更新:模型

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',
    ];

}

控制器

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

【问题讨论】:

  • 没有id怎么更新?然后尝试匹配一些列,如网站标题,然后获取 id,然后保存

标签: php laravel laravel-5


【解决方案1】:

您忘记在update 方法中设置$settings 变量

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

甚至更好更短

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

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

当然,只有在 Settingsmodel 的 fillable 属性中填充需要批量分配的列时,这才有效。

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

编辑

试试这个

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

编辑

将此添加到您的 Settings 模型中

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

【讨论】:

  • 感谢您的回答。我喜欢第二个较短的变体,但它不会更新数据库。只是重新加载页面。这里有什么问题?我在设置模型中有fillable 属性
  • 第一个变种我有 sql 错误:Column not found: 1054 Unknown column 'id' in 'where clause'
  • 这出现是因为您的列名称settings_default_country 等在您的数据库中,您应该在输入名称和可填写名称中添加settings_ 前缀/
  • 我已将我的模型和电流控制器添加到上述问题中。所有列名都正确。
  • 谢谢,但仍然抱怨ID。似乎没有办法在不向表中添加 ID 的情况下更新它
【解决方案2】:
if(count($settings)>0){

}

在 foreach 之前使用这个 if 条件。我认为 $setting 变量是空的。

【讨论】:

  • 不,它不是空的,因为我在页面上看到了数据库中的所有当前设置。
猜你喜欢
  • 2020-11-07
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2014-07-17
  • 2023-04-05
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多