2014-04-02 59 views
0

我想进行相关模型的急切加载。但是,我不想获取整个相关模型,而只想检索它的ID。所以最后,我会有如下内容:laravel 4急于加载的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] 
} 

我宁愿避免循环。

UPDATE

我的理解没有循环我不能做到,我也做了以下内容:

 $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

通常你不能通过这种方式获得id,但是在获得结果后你必须做更多的事情,并且必须使用“外键”才能获得相关模型。 –

回答

0

笔直的解决办法是在相关模型中定义可见字段:

class RelatedModel extends Eloquent 
{ 
    protected $visible = array('id'); 
} 

注意,这将是toArray()方法到处返回的唯一领域。

0

直接和您将无法获得所有id S IN的单一模式,每种模式都会有它自己的相关车型,但你可以使用类似以下获得相关模型的id S,例如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); 

现在,您只需用相关的型号名称重命名PostInvoicecomments。这里Post有以下关系许多评论在Post模型中定义:

// Post model 
public function comments() 
{ 
    return $this->hasMany('Comment'); // Comment model 
} 
+0

有没有办法在模型级别处理这个问题? – Dan

2

您可以使用关系来获得标识符。

  1. 自定义功能:

    public function myRelationIds() 
    { 
        return $this->myRelation->lists('id'); 
    } 
    

    你调用该函数,并将结果添加到响应。

  2. Through accessor

    public function getMyRelationIdsAttribute() 
    { 
        return $this->myRelation->lists('id'); 
    } 
    

    现在,你可以让这个属性被自动添加,当模型变得数组或JSON与appends属性:

    protected $appends = array('my_relation_ids'); 
    

注意,它继续是非常重要的渴望加载关系以防止过多查询。而鉴于这种关系将继续加载,你可能想隐藏它,只有标识符:

protected $hidden = array('myrelation'); 
0

我有一些问题,预先加载最近我自己。我的建议是只复制急切的加载操作,它会运行第二个查询,包括来自第一个模型的id的whereIn()。让我们回到你的例子

$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来搜索模型,则可以进一步简化此操作。