0

我正在使用 Eloquent 从名为“businesses”的表中选择一行。任何业务都可以与一个或多个“行业”相关联。我已经在商业模型中设置了这个:

public function industries() {
    return $this->belongsToMany('Industry');
}

在控制器中,当我选择模型时,我渴望加载行业:

$mdl = Business::find($business_id);
$mdl->load('industries');
return Response::json($mdl);

这将返回如下内容:

{"id":123,"name":"My Business","address":"123 Easy Street","industries":[{"id":1,"name":"Technology"},{"id":7,"name":"Research"}]}

这几乎是我需要的。我希望只是让响应看起来像这样:

{"id":123,"name":"My Business","address":"123 Easy Street","industries":[1,7]}

我知道我可以做这样的事情:

$ind = array();
foreach($mdl->industries as $industry) $ind[] = $industry->id;
$mdl->industries = $ind;

我宁愿不那样做。它很丑,它让我的代码看起来很不像 laravel。

首先我想这样做的原因是因为当我保存业务时,我将使用这样的东西:

$mdl->industries()->sync(Input::get('industries'));

SYNC 方法只接受一个 ID 数组,所以我希望进出服务器的 JSON 对象具有相同的格式。我真的宁愿在加载它时不使用对象数组,而在保存时不使用 ids 数组。是否有此类事情的最佳实践或更简单的方法来完成我正在尝试做的事情?

谢谢!

4

2 回答 2

3
$mdl = Business::with('industries')->find($business_id)->toArray();
$mdl['industries'] = array_pluck($mdl['industries'], 'id');
return $mdl;

如果您经常使用它,请将以下方法添加到您的Business模型中:

public static function getWithIdustryIds ($business_id)
{
    $mdl = Business::with('industries')->find($business_id)->toArray();
    $mdl['industries'] = array_pluck($mdl['industries'], 'id');
    return $mdl;
}
于 2013-09-08T02:51:57.680 回答
0

你的模型关系应该是

public function industries() {
    return $this->belongsToMany(Industry::class);
}

假设您的数据透视表有一个行业 ID 列,您可以使用仅预先加载行业 ID 列

$mdl = Business::with(['industries' => function($query){
    $query->select('industry_id');
}])->get()
于 2017-07-31T23:09:58.130 回答