Laravel 5.4: Сохранение предложения «Где» в переменной

Я хочу написать динамический запрос на обновление в 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. Это скриншот ошибки: ссылка на файл изображения

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


person Sameer Ali    schedule 04.06.2017    source источник


Ответы (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'],
];
person Sandeesh    schedule 04.06.2017
comment
Спасибо. Оно работает. Не могли бы вы рассказать мне больше об условиях. В случае, как я могу использовать предложения AND и OR в массиве $conditions? - person Sameer Ali; 04.06.2017
comment
Спасибо за ответ. :) - person Sameer Ali; 04.06.2017

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

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);
person linuxartisan    schedule 04.06.2017
comment
я должен изменить что-нибудь в моей функции контроллера? - person Sameer Ali; 04.06.2017
comment
Что бы я сделал, если бы мне нужно было использовать оператор AND OR в моем предложении where? например, где city_id = 1 AND city_name = london AND city_country = uk. - person Sameer Ali; 04.06.2017
comment
Для этого вам нужно добавить отдельные предложения where. Кроме того, пожалуйста, задайте другой вопрос по этой проблеме. Я ответил на ваш первоначальный вопрос. Если это решило вашу проблему, пожалуйста, проголосуйте и примите ответ. - person linuxartisan; 04.06.2017
comment
@linuxartisan where также принимает закрытие и массивы. - person Sandeesh; 04.06.2017
comment
@Sandeesh Может быть, ОП должен был четко понимать это с самого начала. Поскольку ОП не упомянул о таких вещах в исходном вопросе, я дал свой ответ соответственно. - person linuxartisan; 05.06.2017

Ваш код не совсем в стиле 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
]);

Пример конструктора запросов:

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

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

person Anton    schedule 04.06.2017
comment
Я новичок в Ларавеле. Предположим, у меня в базе данных более 100 таблиц, тогда нужно ли мне создавать 100 разных файлов модели для каждой таблицы? Приведенный вами пример хорош для одной таблицы, но я хочу написать функцию, которую можно использовать для всех таблиц. Я делал это в Codeigniter. - person Sameer Ali; 04.06.2017
comment
В общем, нет ничего плохого в создании даже 100 классов, если в проекте требуется такое большое количество таблиц. На нагрузку это не повлияет, так как классы загружаются только тогда, когда вам нужно их использовать. При этом вы получите огромное количество преимуществ, предоставляемых Eloquent: отношения, мутаторы, наблюдатели. Код останется чистым и понятным. - person Anton; 04.06.2017