在 WITH 子句中使用 SELECT 预加载关系 returns 为空
Eager loading relationship returns empty using SELECT in WITH clause
使用 Laravel 5.4,我有一个正确 return 关系的查询。在查询中使用 "with" 子句,我试图 return 仅 select 从我的控制器中的关系编辑列。
当我将 select 添加到 with 子句时,关系 return 是一个空数组。奇怪的是,如果我添加不同的参数,例如 groupBy 或 join,查询会 return 结果。所以我的设置不喜欢查询中的 select。
到目前为止我已经尝试过:
- 使用select原始
- 使用select(DB::raw)
- 尝试在我的模型中将此定义为单独的关系。
到目前为止没有任何效果。 Sql 转储日志时看起来不错。
这是我的模型:
// MODEL
namespace App;
use Illuminate\Database\Eloquent\Model;
use DB;
class ClassBlocks extends Model
{
public $timestamps = false;
public function schedule(){
return $this->hasMany('App\ClassSchedules', 'class_block_id', 'id');
}
}
这是我的控制器:
//CONTROLLER
use App;
use DateTime;
use Illuminate\Http\Request;
class ProgramsController extends Controller
{
public function filterClass(Request $request, App\ClassBlocks $block)
{
$block = $block->newQuery();
// Attempt to eager load relationship
// Returns results when "select" disabled
$block->with([
'schedule' => function($query){
$query->select('time_start');
$query->groupBy('day');
},
]);
return $block->get();
}
}
这是启用 select 的示例结果(安排 return 为空):
[
{
"id": 13,
"program_id": "1",
"class_group_id": "1",
"schedule": [
]
}
]
这是禁用 select 的结果(select 禁用时的 return 关系):
[
{
"id": 13,
"program_id": "1",
"class_group_id": "1",
"schedule": [
{
"id": 338,
"class_group_id": "1",
"program_id": "1",
"class_block_id": "13",
"date": "06/13/2017",
"day": "Tuesday",
"instructor_id": "1",
"time_start": "6:30am",
"time_end": "6:30am"
},
{
"id": 339,
"class_group_id": "1",
"program_id": "1",
"class_block_id": "13",
"date": "06/14/2017",
"day": "Wednesday",
"instructor_id": "2",
"time_start": "6:30am",
"time_end": "6:30am"
}
]
},
]
任何见解将不胜感激。
这里的问题是:
$query->select('time_start');
Laravel 需要有连接 2 条记录的列。在这种情况下,您可能应该使用:
$query->select('time_start', 'class_block_id');
使其发挥作用。
显然,您将以这种方式得到 class_block_id
的回应。如果你真的不想要它,也许你应该创建一些转换器来 return 正是你想要的响应。
使用 Laravel 5.4,我有一个正确 return 关系的查询。在查询中使用 "with" 子句,我试图 return 仅 select 从我的控制器中的关系编辑列。
当我将 select 添加到 with 子句时,关系 return 是一个空数组。奇怪的是,如果我添加不同的参数,例如 groupBy 或 join,查询会 return 结果。所以我的设置不喜欢查询中的 select。
到目前为止我已经尝试过:
- 使用select原始
- 使用select(DB::raw)
- 尝试在我的模型中将此定义为单独的关系。
到目前为止没有任何效果。 Sql 转储日志时看起来不错。
这是我的模型:
// MODEL
namespace App;
use Illuminate\Database\Eloquent\Model;
use DB;
class ClassBlocks extends Model
{
public $timestamps = false;
public function schedule(){
return $this->hasMany('App\ClassSchedules', 'class_block_id', 'id');
}
}
这是我的控制器:
//CONTROLLER
use App;
use DateTime;
use Illuminate\Http\Request;
class ProgramsController extends Controller
{
public function filterClass(Request $request, App\ClassBlocks $block)
{
$block = $block->newQuery();
// Attempt to eager load relationship
// Returns results when "select" disabled
$block->with([
'schedule' => function($query){
$query->select('time_start');
$query->groupBy('day');
},
]);
return $block->get();
}
}
这是启用 select 的示例结果(安排 return 为空):
[
{
"id": 13,
"program_id": "1",
"class_group_id": "1",
"schedule": [
]
}
]
这是禁用 select 的结果(select 禁用时的 return 关系):
[
{
"id": 13,
"program_id": "1",
"class_group_id": "1",
"schedule": [
{
"id": 338,
"class_group_id": "1",
"program_id": "1",
"class_block_id": "13",
"date": "06/13/2017",
"day": "Tuesday",
"instructor_id": "1",
"time_start": "6:30am",
"time_end": "6:30am"
},
{
"id": 339,
"class_group_id": "1",
"program_id": "1",
"class_block_id": "13",
"date": "06/14/2017",
"day": "Wednesday",
"instructor_id": "2",
"time_start": "6:30am",
"time_end": "6:30am"
}
]
},
]
任何见解将不胜感激。
这里的问题是:
$query->select('time_start');
Laravel 需要有连接 2 条记录的列。在这种情况下,您可能应该使用:
$query->select('time_start', 'class_block_id');
使其发挥作用。
显然,您将以这种方式得到 class_block_id
的回应。如果你真的不想要它,也许你应该创建一些转换器来 return 正是你想要的响应。