Laravel 5 Eloquent相关模型返回没有ID的特定字段

时间:2015-11-04 10:13:04

标签: php laravel eloquent laravel-5.1

我有两种型号,一般坐标。 Coordinate有很多Fair。

合理中检索相关的坐标时,我只想返回经度纬度,没有时间戳或ID。

当我运行$fairs = Fair::with('coordinates')->get();时,坐标关系为空

如果我将合格模型中的select上的belongsTo方法更改为return $this->belongsTo('App\Coordinate', 'coordinate_id')->select(array('id', 'longitude', 'latitude'));

响应正确,但包含ID。

"coordinates":{
    "id": 1,
    "longitude":"-25.704571",
    "latitude":"59.145973"
},

有没有办法使用选择方法而不包含ID?

我发现如果我还将protected $hidden = ['id'];添加到Coordinate模型中,我想要的响应是正确的。

"coordinates":{
     "longitude":"-25.704571",
     "latitude":"59.145973"
 },

这似乎不是正确的做法。

△:     

namespace App;

use Illuminate\Database\Eloquent\Model;

class Fair extends Model
{
    protected $dateFormat = 'c';

    public function coordinates()
    {
        return $this->belongsTo('App\Coordinate', 'coordinate_id')->select(array('longitude', 'latitude'));
    }
}

坐标:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Coordinate extends Model
{
    protected $fillable = ['longitude', 'latitude'];

    public function fairs()
    {
        return $this->hasMany('App\Fair');
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用: 1。

$fairs = (new Fair)->get();
foreach($fairs as $fair){
    echo $fair->coordinates->longitude;
}

和 2。

$fairs = (new Fair)->with('coordinates')->get();
foreach($fairs as $fair){
    echo $fair->coordinates->longitude;
}

区别在于2.案例使用预先加载(查询优化)更多:http://laravel.com/docs/5.1/eloquent-relationships#eager-loading

Laravel默认情况下不加入(执行连接查询),当您引用加入数据时,它会加入(执行连接查询),例如“$ fair-&gt; coordinates-&gt; longitude”。

答案 1 :(得分:0)

您可以使用闭包来使用addSelect方法急切加载所需的列:

$posts = Fair::with(array('coordinates' => function($query)
{
    $query->addSelect(array('longitude', 'latitude'));
}))->get();

这样,您就不必永久地隐藏id列的结果,而只是针对该特定查询。

答案 2 :(得分:0)

如果您只想在一个查询中完成所有操作,可以加入并选择

$data = Fair::query()
    ->join('coordinates','coordinates.id','=','fairs.coordinate_id')
    ->get(['fairs.*','coordinates.latitude','coordinates.longitude'])

如果您使用预先加载,那么您别无选择,只能获取ID,因为这是如何雄辩地映射结果,这样结果将只是Fair属性的一部分。