Laravel 5.4:从pluck中的相关表中获取concat数据

时间:2017-04-30 03:44:04

标签: laravel laravel-5.4

我正在为无线电新闻广播编写一个分配系统。数据表:

station
id | calls
---| -----
 1 | cxri

newscast
id | name_input | for_station_id
---|------------|---------------
 1 | am         |  1

assignment
id | newscast_id | user_id
 1 |       1     |  5

Assignment.edit的控制器如下:

if (! Gate::allows('assignment_edit'))
    return abort(401);
    }
    $relations = [
        'anchors' => \App\User::get()->pluck('name', 'id')->prepend('Please select', ''),
        'casts' => \App\Newscast::get()->pluck('name_input', 'id')->prepend('Please select', ''),
    ];

    return view('assignment.create', $relations);

新闻广播模式:

public function for_station()
{
    return $this->belongsTo(Station::class, 'for_station_id')->withTrashed();
}

现在我得到了

"casts" => Collection {#451 ▼
    #items: array:2 [▼
      "" => "Please select"
      1 => "am"
    ]
}

我想要

"casts" => Collection {#451 ▼
    #items: array:2 [▼
      "" => "Please select"
      1 => "cxri-am"
    ]
}

我该如何实现?

或者我应该对数据进行非规范化并使name_input'cxri-am'而不是'am'?

我尝试了什么:
Laravel pluck fields from relations

中接受的答案
'casts' => \App\Newscast::with('station')->get()->pluck('name_input', 'id'),

错误

Call to undefined relationship [station] on model [App\Newscast]

我根据Laravel: get/show data from related tables中的讨论包含了上面的新闻广播模型。基于该讨论,在我看来,新闻广播应该已经能够访问电台呼叫。但如上所示,调用不在$ casts中。

1 个答案:

答案 0 :(得分:1)

你已经尝试过了。 with()函数需要关系函数的名称,而不是表,因此这应该可以用于获取加载的关系模型:

'casts' => \App\Newscast::with('for_station')->get(),

至于让数据以你想要的方式连接,我会在Newscast模型上设置accessor,它将返回你想要的数据:

function getNameInputStationAttribute() {
    return $this->for_station->calls . "-" . $this->input_name;
}

然后您可以使用它:

'casts' => \App\Newscast::with('for_station')->get()->pluck('name_input_station', 'id')->prepend('Please select', ''),

如果我可以指出其他一些内容,则401的返回代码表示Unauthenticated,而403表示Unauthorized更适用于Gate返回false。此外,类函数应该是cammel大小写,因此for_station函数应该是forStation,或者只是station