频繁的ORM对象关系


Eloquent ORM object relashionship

我有两个表。学校和学生。

当我拿到所有学生时

Student::all()->toJson();

我收到的回复

[
  {
    "id": 1,
    "school_id": 1,
    "name": "Jhon"
  }
]

但实际上我想收到

[
  {
    "id": 1,
    "school": {
        "id": 1
    },
    "name": "Jhon"
  }
]

我知道我可以做

Student::with(['school']);

但它会对学校表进行额外的查询,这是不必要的,因为我只需要学校id,而不需要所有其他属性。

您可以覆盖模型中的toArray方法。toJson也可能发生同样的事情,但toArraytoJson调用,在我看来,在toArray 中做这样的事情更好

class Student extends Eloquent {
    public function toArray($options = 0){
        $this->school = ['id' => $this->school_id];
        unset($this->school_id);
        return parent::toArray($options);
    }
}

编辑

为了保持模型不变,只更改输出(可能更好)

public function toArray($options = 0){
    $array = parent::toArray($options);
    $array['school'] = ['id' => $array['school_id']];
    unset($array['school_id']);
    return $array;
}

您可以使用Illuminate'Support'Collectiontransform方法来获得更自动化的解决方案:

$students = Student::all();
$students->transform(function($el) {
    $el = $el->toArray();
    foreach ($el as $k => $v) {
        if (substr($k, -3) === '_id') {
            $el[substr($k, 0, -3)]['id'] = $v;
            unset($el[$k]);
        }
    }
    return $el;
});

return $students;

如果您要多次调用此函数(我想您会这样做),最好是扩展Illuminate'Database'Eloquent'Collection并添加一个方法来实现这一点。然后在基本模型上编辑newCollection方法以使用新的扩展类。