Eager加载关系在WITH子句中使用SELECT返回空

Mda*_*alz 3 laravel eloquent laravel-5 laravel-5.4

使用Laravel 5.4,我有一个正确返回关系的查询.在查询中使用"with"子句,我试图仅从控制器中的关系返回选定的列.

当我将select添加到with子句时,relationship返回一个空数组.奇怪的是,如果我添加一个不同的参数,例如groupBy或者加入查询,则返回结果.所以我的设置不喜欢查询上的选择.

到目前为止,我尝试过:

  • 使用selectRaw
  • 使用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');
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

//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();

    }
}
Run Code Online (Sandbox Code Playgroud)

以下是启用select的示例结果(schedule返回空):

[
  {
    "id": 13,
    "program_id": "1",
    "class_group_id": "1",
    "schedule": [

    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

这里是select禁用的结果(选择禁用时返回关系):

[
  {
    "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"
      }
    ]
  },
]
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激.

Mar*_*łek 8

这里的问题是:

$query->select('time_start');
Run Code Online (Sandbox Code Playgroud)

Laravel需要具有2条记录之间连接的列.在这种情况下,您应该使用:

$query->select('time_start', 'class_block_id');
Run Code Online (Sandbox Code Playgroud)

使它工作.

显然你会class_block_id以这种方式回应.如果你真的不想要它,可能你应该创建一些转换器,它将返回你想要的响应.