【问题标题】:laravel 5 custom method in model with query带有查询的模型中的laravel 5自定义方法
【发布时间】:2015-10-21 22:51:45
【问题描述】:

在我的 Room 对象中,我想获得优先级最低的图片。所以我添加了我的房间模型:

public function picture(){
    Return Picture::where('room_id', $this->id)->orderBy('priority', 'asc')->first();
}

在我的控制器中,我将此方法称为:

public function($id){
  $room = Room::findOrFail($id); 
  $room->picture();
}

但是当我试图在我的视图中得到它时:

 {{$room->picture}}

我收到以下错误:

关系方法必须返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象

使用 {{$room}} 时,我在房间对象中看不到任何图片对象,但应用程序没有崩溃。

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    如果您希望能够获取这样的最新图片,则需要将关系定义放在 pictures() 方法中,而不是获取对象。这样你就可以使用 Eloquent 的热切加载;获取具有最低(就价值而言)优先级的图片也将非常容易。

    将以下内容添加到您的 Room 类中:

    //relation definition - one to many
    public function pictures() {
      return $this->hasMany(Picture::class);
    }
    
    //Eloquent getter
    public function getPictureAttribute() {
      return $this->pictures()->orderBy('priority', 'asc')->first();
    }
    

    现在,您可以通过执行以下操作轻松访问 $room 对象上最重要的图片:

    $picture = $room->picture;
    

    您可以在此处阅读有关如何在模型中设置不同类型关系的更多信息:http://laravel.com/docs/5.1/eloquent-relationships

    【讨论】:

    • 我认为这样做是不好的做法,因为现在你选择所有而不是过滤而不是选择一个或者我错了吗?
    • 没有。在查询构建器上调用 first() 并将“限制 1”添加到查询中,因此仅从数据库中获取一个对象
    • @jedrzej.kuylo 我得到以下错误:关系方法必须返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象
    • 在哪里?图片()正在返回关系对象,也许你有一些其他关系定义不正确?你能粘贴你的模型代码吗?
    • 你是否删除了原来的“picture()”方法?它导致了这样的错误,如果它仍然存在那就是原因。删除它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多