我正在研究广播新闻广播的分配系统。试图返回特定新闻广播的所有作业的视图,我感到很沮丧。
表格
用户表
id | name
---|-------
1 | Admin
2 | Susan
3 | Ed
4 | Jen
新闻广播表
id | forStation_id | name
---|---------------|-----
1 | 1 | AM
2 | 1 | PM
3 | 2 | Sports
电台表
id | calls
---| -----
1 | JNDV
2 | YXWQ
作业表
id | anchorId | newscastId | startDate | endDate | isTemp
---|----------|------------|-------------|-------------|--------
1 | 2 | 1 | 01 May 2017 | 31 Dec 2999 |
2 | 3 | 1 | 02 May 2017 | 06 May 2017 | True
3 | 4 | 2 | 01 Apr 2017 | 31 Dec 2999 |
4 | 3 | 3 | 01 Apr 2017 | 28 Apr 2017 |
(分配模型的一部分)
public function anchor()
{
return $this->belongsTo(User::class, 'anchor_id')->withTrashed();
}
public function cast()
{
return $this->belongsTo(Newscast::class, 'cast_id')->withTrashed();
}
(部分)新闻广播模式
public function for_station()
{
return $this->belongsTo(Station::class, 'for_station_id')->withTrashed();
}
function getNameInputStationAttribute() {
return $this->for_station->calls . "-" . $this->name_input;
}
(分配控制器的一部分)
/**
* Display all Assignments for one input name.
*
* @param int $name
* @return \Illuminate\Http\Response
*/
public function showAssignmentsByCastName($castName)
{
if (! Gate::allows('assignment_view')) {
return abort(403);
}
$relations = [
'anchors' => \App\User::get()->pluck('name', 'id'),
'casts' => \App\Newscast::with('for_station')->get()->pluck('name_input_station', 'id'),
'assignments' => \App\Assignment::with('cast')->get(),
];
dump($relations);
return view('assign.list', compact('castName') +$relations);
}
正如我所期望的那样,此代码会返回assignments
的完整集合。
输出
Anchor | Cast Name | Start Date | End Date
---------|-------------|-------------|-------------
Susan | JNDV-AM | 01 May 2017 | 31 Dec 2999
Ed | JNDV-AM | 02 May 2017 | 06 May 2017
Jen | JNDV-PM | 01 Apr 2017 | 31 Dec 2999
Ed | YXWQ-Sports | 01 Apr 2017 | 28 Apr 2017
我已经尝试了几种方法将作业限制为只有一个newscastId
,但迄今为止没有成功。
2017年5月1日 / assignment / list / JNDV-AM 的所需输出
Anchor | Cast Name | Start Date | End Date
---------|-------------|-------------|-------------
Susan | JNDV-AM | 01 May 2017 | 31 Dec 2999
Ed | JNDV-AM | 02 May 2017 | 06 May 2017
短期作业是临时作业(isTemp = True)。在它有效的日子里,它应该列在最顶层。
2017年5月2日至2017年5月6日期间 / assignment / list / JNDV-AM 的预期输出
Anchor | Cast Name | Start Date | End Date
---------|-------------|-------------|-------------
Ed | JNDV-AM | 02 May 2017 | 06 May 2017
Susan | JNDV-AM | 01 May 2017 | 31 Dec 2999
我正在修改管理面板生成器工具生成的代码。在我看来,查询所有用户和所有演员并不是最有效的方法。我想,因为我只寻找当前和现在的&一个新闻广播的未来作业,应该过滤anchors
和casts
关系。
基本问题
我应该对什么做出改变
'assignments' => \App\Assignment::with('cast')->get(),
只获得JNDV-AM的分配(newscastId = 1)?
高级问题
您如何建议更改relations
以仅返回JNDV-AM的当前和未来作业,今天的作业首先是最少的查询?
答案 0 :(得分:0)
您可以将函数传递到with
语句中:
'assignments' => \App\Assignment::with(['cast' => function ($query) {
$query->where('newscastId', '=', 1);
}])->get()
答案 1 :(得分:0)
以下是我提出的工作代码:
(部分)分配控制器
public function showAssignmentsByCastName($calls, $name_input)
{
if (!Gate::allows('assignment_view')) {
return abort(403);
}
$castName = strtoupper($calls). "-" . $name_input;
$station_id = \App\Station::where('calls', $calls)->get();
$station = \App\Station::findOrFail($station_id);
$cast_id = \App\Newscast::where([
['for_station_id', $station->id],
['name_input', $name_input]
])->get();
$cast = \App\Newscast::findOrFail($cast_id);
$relations = [
'anchors' => \App\User::get()->pluck('name', 'id'),
'casts' => \App\Newscast::where('cast_id', $cast->id),
'assignments' => \App\Assignment::where('cast_id', $cast->id)->get(),
];
return view('assign.list', compact('castName') + $relations);
}
网络路线
Route::get('assign/{calls}-{name_input}', 'AssignmentsController@showAssignmentsByCastName')->name('assign.list');