从关系中获取模型数据的最有效方法

时间:2014-12-04 12:39:32

标签: php laravel laravel-4 eloquent

我的Message模型有很多MessageAttachment

以下代码:

$message = Message::find(1);

return $message->attachments;

输出:

[
    {
        "id": 1,
        "message_id": 1,
        "attachable_id": 1,
        "attachable_type": "Item",
    },
    {
        "id": 2,
        "message_id": 1,
        "attachable_id": 1,
        "attachable_type": "Photo",
    }
]

现在,虽然这一切都很棒,但我想要一种获取模型的方法,MessageAttachment指的是(即照片或项目)。类似的东西:

return $message->attachments[0]->attachable; // outputs the Item 1 model

这是我被卡住的地方。你会如何以干净简单的方式使用上述结构或类似的东西?

3 个答案:

答案 0 :(得分:0)

这应该有效:

$messages = Message::find(1);

foreach($messages as $key => $value){
   $model = $value->attachable;
   $array[$key] = $model::find($value->attachable_id);
}

dd($array);

答案 1 :(得分:0)

简单。解决方案:

class Message extends \Eloquent {
    public function attachments() {
        return $this->hasMany('MessageAttachment');
    }
}

class MessageAttachment extends \Eloquent {
    public function attachable() {
        return $this->morphTo();
    } 
}

这样做的:

$message = Message::find(1);
$message->attachments[0]->attachable; // returns the model

答案 2 :(得分:0)

最佳做法是直接使用现实获取项目。你可以这样做:

Messages::with('attachments', 'attachments.photo')->get();

这里的照片是附件的关系。将获取所有关系。如果您只有一条消息,则可以通过以下方式访问该关系:

$message->attachments->first()->photo