设置关系模型响应

时间:2015-11-16 01:10:28

标签: php mysql laravel orm

我使用Laravel 4.2。我有以下代码:

LogMessage型号:

class LogMessage extends Eloquent {
    public function type() {
        return $this->belongsTo('LogMessageType');
    }
}

简单路线:

Route::get('/test', function() {
    return LogMessage::take(1)->with('type')->get(); 
});

回复如下:

[
  {
    "ip": "192.168.0.100",
    "ts": "2015-11-11 12:22:58",
    "info": "some info",
    "type": {
      "id": "1",
      "name": "login"
    }
  }
]

一切都很好,但我需要这样的回应:

[
  {
    "ip": "192.168.0.100",
    "ts": "2015-11-11 12:22:58",
    "info": "some info",
    "type": "login"
  }
]

我只需要加载name模型中的LogMessageType属性,然后将其粘贴到LogMessage的{​​{1}}属性中。

我是Laravel的新手。我该怎么办?任何建议,谢谢:)

1 个答案:

答案 0 :(得分:1)

没有内置的ORM方法。访问它的两种方法是在您想要访问它时链接它:

$logMessage->type->name

或手动构建所需的阵列响应。如果严格依据您的示例,则会出现一个奇怪的功能问题,因为您不想覆盖'类型'与标量值的关系。以下进行了调整:

Route::get('/test', function() {
    $message_response = LogMessage::first();
    $message_response->type_name = $message_response->type->name;
    return $message_response;
});

这与第一个示例基本相同,但更接近您想要的输出。如果您正在处理Collection而不是单个Eloquent模型,那么您将需要使用get()和foreach()来构建响应Collection / array:

Route::get('/test', function() {
    $message_response = new Collection; // or Array;
    $messages = LogMessage::with('type')->get();
    foreach ($messages as $message)
    {
        $message->type_name = $messages->type->name;
        // you can also completely build your response array from scratch here if you wish
        $message_response->add($message);
    }
    return $message_response;
});