Разница между методом модели и построителя запросов при использовании get и first в laravel?

если я просто хочу получить только одно имя столбца

- использовать модель --------

$model_use_get  =Model::select('name')->where('id','=',10)->get();

$want=$model_use_get[0]['name'];

$model_use_first=Model::select('name')->where('id','=',10)->first();

$want=$model_use_first['name'];

--- использовать построитель запросов -----

$query_use_get  =DB::table('a1)->select('name')->where('id','=',10)->get();

$want=$query_use_get[0]->name;

$query_use_first=DB::table('a1)->select('name')->where('id','=',10)->first();

$want=$query_use_first->name;

какая разница? Разве и модель, и метод запроса не составляют коллекцию? или объект? (массив?) я перепутал !!! Есть ли какой-либо прямой способ просто получить один выбор, не требуя повторной обработки? как показано ниже (я подтверждаю, что результат только один, потому что я использую where id = xxx)

$want=model::select('name)->.... 
$want=DB::table('a1')->select('name').....

person robspin    schedule 27.08.2018    source источник
comment
спасибо за ошибку при вводе, исправьте уже.   -  person robspin    schedule 27.08.2018


Ответы (2)


Разница довольно проста:

  • first() получает одну запись из базы данных
  • get() получает набор элементов (аналогично массиву)

Итак, для first() вы можете получить свойство модели, используя $model->property, но для get у вас есть несколько элементов, поэтому вы можете получить свойства с помощью цикла:

foreach ($models as $model) {
   $model->property;
}

Когда вы запускаете get() и позже first таким образом, вы запускаете 2 запроса, но вы можете вызывать first также для элементов, которые вы уже получили из базы данных:

$models = Model::select('name')->where('id','=',10)->get();

foreach ($models as $model) {
   echo $model->name;
}

$firstModel = $models->first();

$want = $firstModel->name;
person Marcin Nabiałek    schedule 27.08.2018
comment
Но я хочу получить результат, который подтверждаю, это только один результат. Итак, могу ли я использовать $ models = Model :: .... - ›get () -› first () и $ models- ›name? опуская foreach? - person robspin; 28.08.2018
comment
$ A = A- ›get (), $ B = $ A-› first () два шага отличаются от одного шага $ B = A- ›get () -› first () или $ B = A- ›first ()? - person robspin; 28.08.2018
comment
@robspin Если вы уверены, что есть только 1 запись, вы должны использовать A->first(). Он просто возьмет одну запись из базы данных, и вы сможете получить доступ к модели напрямую (без какого-либо цикла) - person Marcin Nabiałek; 28.08.2018

Чтобы ответить на вопрос, комбинация Model, DB::table(), ->get() и ->first() все возвращает разные вещи.

1-й экземпляр, Model и ->get():

$collection = Model::get(); 
// Returns a `Collection` of `Model` records, constrained to your additional query logic.

2-е, Model и ->first():

$model = Model::first(); 
// Returns a single `Model`, or `null`, based on your query logic.

3-е, DB::table() и ->get():

$collection = DB::table("table")->get(); 
// Returns a `Collection` of `stdClass` objects, based on your query logic.

4-е, DB::table() и ->first():

$record = DB::table("table")->first(); 
// Returns a single `stdClass`, or `null`, based on your query logic.

Надеюсь, это все проясняет. Есть дополнительные закрытия, такие как find(), findOrFail(), paginate() и т. Д., Которые возвращают похожие вещи, так что поиграйте с ними и посмотрите, что лучше всего подходит для ваших нужд.

person Tim Lewis    schedule 27.08.2018
comment
Таким образом, запрос представляет собой единственный stdClass, используйте $ result- ›name; запрос является коллекцией, используйте $ result [0] ['name'], чтобы получить первый элемент? Paginate должен быть коллекцией, поэтому используйте $ paginate [0] ['name']? Но когда контроллер отправляет для просмотра использование с (result, $ result), он становится stdClass на blade-сервере, используйте $ result- ›name? - person robspin; 28.08.2018
comment
Не совсем. Когда это Model или stdClass, используйте $model->{property}, например name, для доступа к имени. Когда это Collection, используйте цикл для доступа к каждому Model или stdClass, или $collection->first()->{property}, или $collection[index]->{property}. Передача его в представление не меняет тип. - person Tim Lewis; 28.08.2018