繁体   English   中英

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

[英]Laravel: Eloquent, many to many relationship, how do I eager load only the id of related model?

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

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方法仅接受ID数组,因此我宁愿去往和来自服务器的JSON对象具有相同的格式。 我实际上宁愿在加载对象时不使用对象数组,也不在保存时使用ID数组。 是否有针对此类事情的最佳实践,或更简单的方法来完成我想做的事情?

谢谢!

$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;
}

您的模型关系应为

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM