Laravel 5.4: Хранение предложения 'Where' в переменной

Я хочу написать динамический запрос на обновление в Laravel, который принимает аргументы и может использоваться во всем проекте.

Следующее - моя функция Контроллера:

public function editquery(Request $request)
    {

    $city_id   = $request->input('city_id');    
    $city_name = $request->input('city_name');   

    $tbl  = 'city';    
    $data = ['city_name'=>$city_name];
    $wher = ('city_id',1);

    General_model::editrecord($data,$wher,$tbl);

    return redirect()->action('Admin_controller@cities_page')->with('status','Record Updated Successfully!');;

    }

Ниже моя модель функции:

public static function editrecord($data,$wher,$tbl)
    {
      return DB::table($tbl)->where($wher)->update($data);
    }

Единственная проблема здесь в том, что я не могу сохранить значение ('city_id',1) в переменной $wher. Это скриншот ошибки: ссылка на файл изображения

Есть ли другой способ сделать это. Пожалуйста помоги.

3 ответа

Решение

where Метод принимает массив условий.

$table  = 'city';
$conditions = [
    ['city_id', '=', '1']
];
$data = ['city_name' => $city_name];

General_model::editRecord($table, $conditions, $data);

// In your model

public static function editRecord($table, $conditions, $data)
{
    return DB::table($table)->where($conditions)->update($data);
}

Вы также можете установить несколько условий.

$conditions = [
    ['city_id', '=', '1'],
    ['test', '=', 'test'],
];

редактировать

Это по умолчанию where метод

where($column, $operator = null, $value = null, $boolean = 'and')

Установка четвертого параметра в or сделаю условие orWhere,

пример

$conditions = [
    ['city_id', '=', '1'],
    ['test', '=', 'test', 'or'],
];

Вы не можете сделать это

public static function editrecord($data,$wher,$tbl)
{
  return DB::table($tbl)->where($wher)->update($data);
}

Поскольку, where это функция; он ожидает 2 или 3 аргумента, а не только 1 аргумент.

Вы должны будете передать оба аргумента так

public static function editrecord($data, $where_column, $where_val, $tbl)
{
  return DB::table($tbl)->where($where_column, $where_val)
                        ->update($data);
}

Затем в функции вашего контроллера

$where_column = 'city_id';
$where_val = 1;

General_model::editrecord($data,$where_column,$where_val,$tbl);

Ваш код не совсем в стиле Laravel, зачем вам создавать отдельную статическую функцию, если такие задачи легко решаются стандартными функциями Eloquent / Query Builder?

Красноречивый пример:

Приложение /City.php

<?php
class City extends Model {
    protected $table = 'city';
    protected $primaryKey = 'city_id';
    protected $fillable = ['city_name'];
}

В вашем контроллере:

City::findOrFail($city_id)->update([
    'city_name' => $city_name
]);

Пример Query Builder:

DB::table('city')->where(['city_id' => $city_id])->update([
    'city_name' => $city_name
]);

Это гораздо легче читать, понимать и поддерживать, чем функции, которые делают подобные вещи непостижимым образом.

Другие вопросы по тегам