如何向模型添加新字段并在Eloquent中使用它

时间:2018-05-17 10:47:49

标签: php laravel orm eloquent append

我正在尝试以下内容:我有一个名为Pub的模型,其中包含以下字段:“id”,“name”,“address”,“longitude”,“latitude”,“schedule”,“photo “等等。

由于我需要知道Pub和User之间的距离,所以我创建了一个使用经度和纬度计算Pub Model中距离的函数:

public function pubDistance()
{
    $userLat = '';
    $userLong = '';

    $pubLat = $this->latitude;
    $pubLong = $this->longitude;

    if(!($userLat && $userLong))
    {
        $userLat = 40.4169473;
        $userLong = -3.7035285;
    }

    $earthRadius = 6371;

    $latFrom = deg2rad($userLat);
    $lonFrom = deg2rad($userLong);
    $latTo = deg2rad($pubLat);
    $lonTo = deg2rad($pubLong);

    $latDelta = $latTo - $latFrom;
    $lonDelta = $lonTo - $lonFrom;

    $a = pow(cos($latTo) * sin($lonDelta), 2) +
        pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);

    $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);

    $angle = atan2(sqrt($a), $b);

    $distance = round($angle * $earthRadius, 2);

    return $distance;

}

我在这里使用此功能(在Pub模型中也是如此):

public function getPubDistanceToUserAttribute()
{
    return $this->pubDistance();
}

然后我遇到的问题是如何将字段添加到Pub模型并用于按距离订购我的酒吧。

我可以做的第一件事就是附加:

protected $appends = ['pub_distance_to_user'];

但是我的控制器出现了问题,无法通过新字段进行排序:

public function getPubs()
{
    $pubs = Pub::all();

    return $pubs;
}

这就是我所拥有的:

{
"id": 1,
"name": "Dr. Nikko Braun",
"address": "453 Wyman Crossroad\nSouth Eliashaven, NY 75636",
"longitude": "118.9395890",
"latitude": "-62.3235600",
"schedule": "1986-11-13 10:15:48",
"photo": 
"email": "sylvester.rutherford@example.net",
"phone": "1-841-349-8925 x684",
"pub_distance_to_user": 15556.09

}

我如何在这里使用加速器和变换器,或者在这种情况下使用类似的东西?...

非常感谢!!

4 个答案:

答案 0 :(得分:1)

好的,你可以使用foreach循环

在函数getPubs()中添加一个字段

试试这个,

public function getPubs()
{
    $pubs = Pub::all();

    foreach($pubs as $pub){
    $pub->pub_distance_to_user = Pub::pubDistance();
    }

    return $pubs->sortBy('pub_distance_to_user');
}

修改

我认为你可以定义你的函数来用参数计算距离,就像这样

public function pubDistance($pubLat,$pubLong)
{

$userLat = '';
$userLong = '';

if(!($userLat && $userLong))
{
    $userLat = 40.4169473;
    $userLong = -3.7035285;
}

$earthRadius = 6371;

$latFrom = deg2rad($userLat);
$lonFrom = deg2rad($userLong);
$latTo = deg2rad($pubLat);
$lonTo = deg2rad($pubLong);

$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;

$a = pow(cos($latTo) * sin($lonDelta), 2) +
    pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);

$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);

$angle = atan2(sqrt($a), $b);

$distance = round($angle * $earthRadius, 2);

return $distance;

}

然后你必须通过Pub::pubDistance($pub->latitude,$pub->longitude);

调用函数
public function getPubs()
{
    $pubs = Pub::all();

    foreach($pubs as $pub){
    $pub->pub_distance_to_user = Pub::pubDistance($pub->latitude,$pub->longitude);
    }

    return $pubs->sortBy('pub_distance_to_user');
}

答案 1 :(得分:0)

我不认为你可以在查询中执行此操作,但在集合上应该很容易做到:

event.preventDefault()

答案 2 :(得分:0)

在getPubs函数中定义它,因为$pubs是一个集合,我们可以使用sortBy / sortByDesc方法按升序或降序对集合进行排序。在这种情况下,我们希望提升首先具有最低位数。

来源:Laravel Documentation / sortBy

第二来源:Similar to this SO answer

public function getPubs()
{
    $pubs = Pub::all();
    $sorted = $pubs->sortBy('pub_distance_to_user');
    return $sorted;
}

答案 3 :(得分:-1)

你应该试试这个:

请在模型中添加以下代码与您的表格字段:

/**
     * Attributes that should be mass-assignable.
     *
     * @var array
     */
    protected $fillable = ['yorr_field1','yorr_field1','yorr_field3'];