【问题标题】:The difference between the model and query builder method when using get and first on laravel?在 laravel 上使用 get 和 first 时模型和查询构建器方法的区别?
【发布时间】:2019-02-02 06:32:30
【问题描述】:

如果我只想得到唯一的一个列名

--使用模型--------

$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').....

【问题讨论】:

  • 感谢输入错误,已修复。

标签: laravel collections model laravel-query-builder


【解决方案1】:

要回答这个问题,ModelDB::table()->get()->first() 的组合都会返回不同的东西。

第一个实例,Model->get()

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

第二,Model->first()

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

第三,DB::table()->get()

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

第四,DB::table()->first()

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

希望这可以解决所有问题。还有一些额外的闭包,例如find()findOrFail()paginate() 等,它们都会返回相似的东西,所以请尝试一下,看看哪种方法最适合您的需求。

【讨论】:

  • 所以查询是单个 stdClass ,使用 $result->name;查询是一个集合,使用 $result[0]['name'] 来获取第一项? Paginate 必须是一个集合,所以使用 $paginate[0]['name']?但是当控制器发送到视图使用 with(result,$result) 时,它变成刀片上的 stdClass,使用 $result->name?
  • 不完全。当它是ModelstdClass 时,使用$model->{property} 和名称一样访问名称。当它是Collection 时,使用循环访问每个ModelstdClass,或$collection->first()->{property},或$collection[index]->{property}。将其传递给视图不会改变类型。
【解决方案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;

【讨论】:

  • 但我想得到我确认的结果只是一个结果。那么我可以使用 $models=Model::.... ->get()->first() 和 $models->name 吗?省略 foreach ?
  • $A=A->get() , $B=$A->first() 两步不同于一步 $B=A->get()->first()或 $B=A->first() ?
  • @robspin 如果你确定只有 1 条记录,你应该使用A->first()。它只会从数据库中获取一条记录,您可以直接访问模型(没有任何循环)
猜你喜欢
  • 2017-04-13
  • 2017-04-10
  • 1970-01-01
  • 2020-10-27
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多