php - Laravel: Eloquent ,多对多关系,我如何只急切地加载相关模型的 ID?

标签 php mysql laravel laravel-4

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

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

在 Controller 中,当我选择模型时,我急于加载行业:

$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 对象具有相同的格式。我真的宁愿在加载它时不使用对象数组,在保存时不使用 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;
}

关于php - Laravel: Eloquent ,多对多关系,我如何只急切地加载相关模型的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679560/

相关文章:

php - 如何在 Laravel 中使用 eloquent 或 DB Facade 从单一表单插入多个表

javascript - vue-material 表单 POST 集

php - 使用 Laravel 队列发送批量电子邮件

php - 如何从缓存中优化ajax或请求

mysql - 如何通过两列中的外键对列求和?

PHP preg_replace。仅当 AB 前面没有 "-"或以 0x104567910 结尾时,才将 AB 替换为 CD

mysql - .NET Core 2.0 与 MySQL : Specified key was too long; max key length is 3072 bytes

php - 如何在 Laravel 中动态更改 .env 文件中的变量?

PHP、MySQL - 将复选框与下拉列表相关联

php - 刷新/提交后保持选中状态的复选框以及