laravel - 在 WITH 子句中使用 SELECT 急切加载关系返回空

标签 laravel laravel-5 eloquent laravel-5.4

使用 Laravel 5.4,我有一个正确返回关系的查询。在查询中使用“with”子句,我试图从我的 Controller 中的关系中只返回选定的列。

当我将 select 添加到 with 子句时,relationship 返回一个空数组。奇怪的是,如果我添加不同的参数,例如 groupByjoin,查询会返回结果。所以我的设置不喜欢查询中的 select

到目前为止我已经尝试过:

  • 使用 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');
    }
}

这是我的 Controller :

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

    }
}

这是启用选择的示例结果(计划返回空):

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

    ]
  }
]

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

[
  {
    "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 以这种方式响应。如果你真的不想要它,也许你应该创建一些转换器,它会返回你想要的响应。

关于laravel - 在 WITH 子句中使用 SELECT 急切加载关系返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122127/

相关文章:

php - Laravel "At Least One"字段需要验证

php - 如何提取所有在laravel中重复的行?

Laravel 5 命名空间

mysql - 如何使用 Laravel 的流畅查询构建器选择计数和使用位置?

php - 将日期与laravel中的mongodb ISO日期进行比较

php - 流明中的时区问题

php - 从逗号分隔列表中添加或删除项目

Laravel 5 - RouteCollection.php 第 143 行中的 NotFoundHttpException

php - Laravel Eloquent : keeping all interactions with a model in sync in two different databases

laravel - 具有多对多关系的分页