Php 在Laravel4中,使用eloquent,是否有一种整洁的方式在父模型的对象中包含透视表字段?

Php 在Laravel4中,使用eloquent,是否有一种整洁的方式在父模型的对象中包含透视表字段?,php,laravel,eloquent,Php,Laravel,Eloquent,目前,该模型的具体化如下: "event": { "id": 3, "guid": "17fca759-e0b0-0692-0153-30125231b135", ~~snip~~ "pivot": { "company_id": 1, "event_id": 3, "job_number": "31310" } } 我想用一些方法轻松地将job_number字段移动到主事件对象中,使其返回平面 我们可以

目前,该模型的具体化如下:

"event": 
{
    "id": 3,
    "guid": "17fca759-e0b0-0692-0153-30125231b135",
    ~~snip~~
    "pivot": {
        "company_id": 1,
        "event_id": 3,
        "job_number": "31310"
    }
}
我想用一些方法轻松地将job_number字段移动到主事件对象中,使其返回平面

我们可以解决这个问题,但稍微清理一下返回对象将是超级groovy。前端不需要知道这种关系类型,他们只需要知道在给定的上下文中,工作编号是什么

附录

或者,从长远来看,模型是否有办法访问自己的数据透视表?使用变异子

解决方案

在delmadord的帮助下,最终的输出大致如下:

"events":
{
    "id": 3,
    "guid": "17fca759-e0b0-0692-0153-30125231b135",
    ~~snip~~
    "job_number": "31310"
},
通过创建返回$this->relations['pivot']->job\u number的mutator getJobNumberAttribute,设置$appends=['job\u number']和$hidden=['pivot']来清理响应对象。对结果非常满意。

对于第一个问题,array\u dot可能很方便。它将在使用或加载函数进行急切加载后使用

此外,还可以从访问模型的透视表:

$user = User::find(1);

foreach ($user->roles as $role)
{
    echo $role->pivot->created_at;
}
假设pivot表已经迁移并且belongToMany关系正在工作,您应该能够以相同的方式从模型中访问pivot,即$this->relation->pivot

编辑


似乎可以通过$this->relations['pivot']->property来访问模型中的pivot模型

您可以使用accessor+appends或简单选择:

$model = Model::with(['events' => function ($q) {
   $q->select('YOUR_PIVOT_TABLE.job_number');
}])->first();

// then it's accessible as ordinary properties:

$model->events->first()->toJson();
"event": 
{
    "job_number": "31310",
    "id": 3,
    "guid": "17fca759-e0b0-0692-0153-30125231b135",
    ~~snip~~
    "pivot": {
        "company_id": 1,
        "event_id": 3,
        "job_number": "31310"
    }

}
访问器的工作方式与前面提到的类似,但您需要检查它是否与上下文相关,即pivot是否存在:

// Event model
public function getJobNumberAttribute()
{
   return (count($this->pivot)) ? $this->pivot->job_number : null;
}

数组\u flatte将在->中使用和->加载时中断,不是吗?我希望以某种方式从模型中访问透视表。我觉得这需要传递相关模型或其id,这似乎违背了“整洁”的意图。我希望有一些神奇的东西:如果我通过与公司$companys->events->get->each的关系加载事件。。。或者诸如此类,我希望有某种方式让活动从内部了解公司和关系。标记为已接受,尽管这并不完全正确。我必须拨打$this->relations['pivot]->job_号码才能访问它,但它肯定为我指明了正确的方向。我要么编辑你的帖子,要么解释它的不同之处。谢谢,尽管我还没有解释。我在答案中加入了你的发现,并对你的问题进行了投票。事实上,毕竟,这并没有达到我的期望。它总是返回关系的第一个结果,而不是相关的结果,所以它实际上对我来说是完全无用的/叹气