【问题标题】:Laravel 4 custom methodLaravel 4 自定义方法
【发布时间】:2015-09-13 16:33:09
【问题描述】:

我有两个表路径和标记(一条路径可以有多个标记)。我想使用 trails 表中的自定义方法从两者返回数据。

类似这样的:

public function RetrieveMarker(){
    return Marker::where("relation_id","=", $this->id);
}

但是如何从控制器调用这个方法呢?

我想返回一个包含多个路径的 json 对象及其相关标记,如下所示:

[{id: 1, trail: a trail, markers: [{id: a marker}, id: another marker],}
{id: 2, trail: trail 2, markers: [{id: yam}, id: yaam]}]

并且想做这样的事情:

return $this->trail               
            ->orderBy('title', 'ASC')
            ->where('region_id', $region_id)  
            ->RetriveMarkers()              
            ->get();   

但我得到了一个Illumination/bad/query异常。

我尝试了几种使用范围的变体,但认为这并不难,我只是不知道方法!

顺便说一句,我使用的是 Laravel 4,路径和标记之间没有直接关系,因为标记与多个表多态相关,我不想将“$this->belongsTo”样式用作自定义这里肯定需要方法。

提前致谢。

【问题讨论】:

    标签: laravel laravel-4 model controller


    【解决方案1】:

    您需要在您的情况下定义两个模型,Trail 和 Marker。您的 Trail 类将如下所示,(为了这个示例,我省略了其他一些项目);

    class Trail extends Eloquent
    {
    
        protected $table = 'trails';
    
        public function markers()
        {
            return $this->hasMany('Marker');
        }
    }
    

    您的 Marker 模型将是一个基本的 Eloquent 模型对象;

    class Marker extends Eloquent
    {
        protected $table = 'markers'; 
    }
    

    现在要为所有已加载标记的路径创建查询,您可以使用 Eloquent 的即时加载功能;

    $trailsWithMarkers = $this->trail
         ->with('markers')
         ->orderBy('title', 'ASC')
         ->where('region_id', $region_id)
         ->get();
    

    这里的秘诀是->with('markers'),它指示 Eloquent 执行连接并加载与每个跟踪对象关联的所有标记。

    最后返回 JSON 在 Laravel 中非常简单。该查询末尾的 get 方法返回一个 Laravel 理解的集合,并且可以像这样简单地为您序列化;

    return Response::json($trailsWithMarkers);
    

    我建议你阅读一下Eloquent handles relationships 的方法。

    【讨论】:

    • 感谢您的回复。问题是 Trails 和 Markers 之间的关系是多态的,这种方法对此不起作用。
    • 对不起,错过了关于它是多态的说明。多阅读一下这对你有帮助吗stackoverflow.com/questions/26727088/…
    猜你喜欢
    • 2013-06-02
    • 2014-10-02
    • 1970-01-01
    • 2023-03-21
    • 2013-09-22
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多