Laravel:雄辩,多对多的关系,我如何只加载相关模型的id?

时间:2013-09-08 01:33:24

标签: php mysql laravel laravel-4

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

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;

我宁愿不这样做。这很难看,它使我的代码看起来非常不合适。

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

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

SYNC方法只接受一个I​​D数组,所以我宁愿进出服务器的JSON对象具有相同的格式。当我加载它时,我真的不是一个对象数组,而当我保存时,它确实不是一组id。对于这类事情是否有最佳实践或者更容易实现我正在尝试做的事情?

谢谢!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你的模特关系应该是

$mdl = Business::with(['industries' => function($query){
    $query->select('industry_id');
}])->get()

假设您的数据透视表有一个industry_id列,您可以使用

来急切加载industry_ids
{{1}}