laravel 4作为id列表的热切加载

时间:2014-04-02 05:56:18

标签: php laravel 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]
}

我更喜欢避免循环。

更新

据我所知,我无法在没有循环的情况下制作它,我已经完成了以下工作:

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

现在我的问题是:我有什么方法可以在模型中进行数据操作?这段代码不干净,不能重复使用,我宁愿避免使用它。

4 个答案:

答案 0 :(得分:2)

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

  1. 自定义功能:

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

    您调用该函数并将结果添加到响应中。

  2. Through accessor

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

    现在,当模型变为具有appends属性的Array或JSON时,您可以自动添加此属性:

    protected $appends = array('my_relation_ids');
    
  3. 请注意,继续急切加载关系以防止过多查询非常重要。鉴于关系将继续加载,您可能希望隐藏它并且只有标识符:

    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);

现在,您只需将PostInvoicecomments重命名为相关的型号名称即可。此处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来搜索,则可以进一步简化此操作模型。