Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将新字段添加到模型中,并以雄辩的方式使用它_Php_Laravel_Orm_Eloquent_Append - Fatal编程技术网

Php 如何将新字段添加到模型中,并以雄辩的方式使用它

Php 如何将新字段添加到模型中,并以雄辩的方式使用它,php,laravel,orm,eloquent,append,Php,Laravel,Orm,Eloquent,Append,我正在尝试以下方法:我有一个名为Pub的模型,它有以下字段:“id”、“name”、“address”、“longitude”、“latitude”、“schedule”、“photo”等等 因为我需要知道Pub和用户之间的距离,所以我创建了一个函数,使用经度和纬度计算Pub模型中的距离: public function pubDistance() { $userLat = ''; $userLong = ''; $pubLat = $this->latitude

我正在尝试以下方法:我有一个名为Pub的模型,它有以下字段:“id”、“name”、“address”、“longitude”、“latitude”、“schedule”、“photo”等等

因为我需要知道Pub和用户之间的距离,所以我创建了一个函数,使用经度和纬度计算Pub模型中的距离:

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模型中):

然后,我的问题是如何将字段添加到Pub模型中,并使用该字段按距离排序我的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
}

我怎么能在这里使用accesor和mutator,或者类似的东西

非常感谢

您应该尝试以下方法:

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

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

我不认为您可以在查询中这样做,但在集合中这样做应该很容易:

$pubs = Pub::all()->sortBy(function ($pub) {
     return $pub->pubDistance();
});

好的,您可以使用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::pubdestance($Pub->latitude,$Pub->longitude)调用函数


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

资料来源:

第二来源:


我不确定这是否解决了他提出的问题,他想使用
距离
访问器按最近的酒吧订购酒吧。我不认为访问器在这一点上存在,因为它是一个DB调用。非常感谢你的回答,但它不起作用:它给我按id顺序列出的酒吧:(是
dd(pub::all()->puck的结果('pub_distance_to_user');
正确吗?如果你想让它下降,你可以
$pubs->sortByDesc('pub_distance_to_user
);`非常感谢你的回答,但它不起作用:它给我按id顺序列出的酒吧:(代表我犯了一个错误,你能试试我更新的代码吗?我所做的是在返回数组之前对数组进行排序。对不起,伙计,但它给了我以下消息:“消息”:“方法[pubDistance]在[App\\Http\\Controllers\\PubsController]上不存在。在Controller.php(68)”中那么,数据库中有
pub_distance_to_user
吗?没有,我在一个函数中使用数据库中的纬度和经度计算pub_distance_to_user。我已经更新了我的答案。你的计算方法是在pub模型中,所以分配它。告诉我你是否发现任何困难。嘿,兄弟!!正在好转,但结果仍然是正确的同样,因为你在foreach中所做的不会影响你返回的内容($pubs->sortBy…)我正在尝试修复它,但如果你能帮我a我会很高兴:D.谢谢你知道你可以使用查询生成器进行查询,并通过mysql的魔力直接在查询中计算该字段,对吗?
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;

}
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');
}
public function getPubs()
{
    $pubs = Pub::all();
    $sorted = $pubs->sortBy('pub_distance_to_user');
    return $sorted;
}