调用未定义的方法Builder :: only()

时间:2017-07-10 09:50:55

标签: php laravel laravel-5.4

出于某种原因,我收到了一个错误:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: only()

基本上从数据库中获取条目,并且只使用only()集合

获取特定字段
$canvas = $this->canvasRepo->get(5);

$shapes = $canvas->shapes->each(function($shape) {
   return $shape->only('name', 'height', 'width');
});

3 个答案:

答案 0 :(得分:2)

正如所指出的,这是一种关系,所以你不能使用get()。

如果您希望查询仅从数据库中获取特定字段,则将该关系引用为方法而不是属性。

$canvas->shapes()->get(['name', 'height', 'width']);

但使用$canvas->shapes作为属性会执行查询SELECT *并返回一个可以使用pluckonly

的集合

旧答案

在使用get()only()从数据库中获取数据之前,您需要使用pluck()

$canvas = $this->canvasRepo->get(5);

$shapes = $canvas->shapes->each(function($shape) {
   return $shape->get('name', 'height', 'width');
});

假设您定义了关系,这将仅返回相关形状的'name', 'height', 'width'字段。

但是,如果您使用预先加载以避免n + 1问题会更好。

答案 1 :(得分:0)

关键是你怎么知道only()方法合法? 在Laravel中,只有一个名为only()的方法,它用于检索输入数据的子集。 InteractsWithInput#only

修改

在集合实例初始化时,集合实例$shapes的项目将转换为数组,因此您不应使用only()方法。你可以使用laravel助手提供的array_only()

$shapes = $canvas->shapes->each(function($shape) {
    return array_only($shape, ['name', 'height', 'width']);
});

答案 2 :(得分:-1)

我认为您应该使用pluck代替only来获取table中的特定字段。

但它只适用于一个领域。所以你需要selectget方法。

试试这个:

$shapes = $canvas->shapes->each(function($shape) {
    return $shape->select('name','height','width');
})->get();