我想热切地加载相关模型。然而,我不想获得整个相关模型,而是想要检索它的id。所以最后,我会有以下内容:
{
"error": false,
"invoices": {
"id": 5,
"biz_id": 7,
"doc_num": 0,
"type": 1,
"due_date": "0000-00-00",
"status": null,
"to": null,
"**related_model**": [1,2,3,4]
}
我更喜欢避免循环。
更新
据我所知,我无法在没有循环的情况下制作它,我已经完成了以下工作:
$data = array();
//get models
$models = IncomeDoc::with('relatedReceipts')
->where('type', '!=', 2)
->get()
->toArray();
foreach ($models as $model)
{
$model['related_receipts'] = array_pluck($model['related_receipts'], 'id');
$data[] = $model;
}
现在我的问题是:我有什么方法可以在模型中进行数据操作?这段代码不干净,不能重复使用,我宁愿避免使用它。
答案 0 :(得分:2)
您可以使用该关系来获取标识符。
自定义功能:
public function myRelationIds()
{
return $this->myRelation->lists('id');
}
您调用该函数并将结果添加到响应中。
public function getMyRelationIdsAttribute()
{
return $this->myRelation->lists('id');
}
现在,当模型变为具有appends
属性的Array或JSON时,您可以自动添加此属性:
protected $appends = array('my_relation_ids');
请注意,继续急切加载关系以防止过多查询非常重要。鉴于关系将继续加载,您可能希望隐藏它并且只有标识符:
protected $hidden = array('myrelation');
答案 1 :(得分:0)
非常直接的解决方案是在相关模型中定义可见字段:
class RelatedModel extends Eloquent
{
protected $visible = array('id');
}
请注意,这将是toArray()
方法在任何地方返回的唯一字段。
答案 2 :(得分:0)
直接您无法在单个模型中获得所有id
,每个模型都会拥有自己的相关模型,但您可能会得到相关的模型#s id
使用以下内容,例如Post
是主要/父模型而Post
有许多comments
,因此可以使用以下内容完成:
$ids = array();
$posts = Post::with(array('comments' => function($q){
// post_id is required because it's the foreign key for Post
$q->select(array('id', 'post_id'));
}))->get()->map(function($item) use(&$ids){
$ids[] = $item->comments->fetch('id')->toArray();
});
// Get all ids in one array
$ids = array_flatten($ids);
现在,您只需将Post
与Invoice
和comments
重命名为相关的型号名称即可。此处Post
有许多评论,其中Post
模型中定义了以下关系:
// Post model
public function comments()
{
return $this->hasMany('Comment'); // Comment model
}
答案 3 :(得分:0)
我最近自己急切地加载了一些问题。我的建议是只复制急切加载所做的事情,这是第二个查询,包括第一个模型中的whereIn()
个ID。回到你的例子
$modelsQuery = IncomeDoc::where('type', '!=', 2);
$models = $modelsQuery->get();
$modelIds = $models->select('id')->lists('id');
$relatedReceiptsQuery = RelatedReceipts::whereIn(`model_id`,$modelIds);
$relatedReceipts = $relatedReceiptsQuery->get();
$relatedReceiptsLookup = $relatedReceiptsQuery->lists(`id`,`model_id`)
您将能够遍历$models
并检索$relatedReceipts->find($relatedReceiptsLookup[$models->id])
。如果您只需要RelatedReceipts
中的单个字段,或者您可以将toArray()
添加到$relatedReceipts
并搜索数组而不是使用$relatedReceiptsLookup
来搜索,则可以进一步简化此操作模型。