Laravel 5: атрибут доступа из другой модели

1

Я пытаюсь использовать whereBetween внутри whereHas, но мой whereBetween не работает, потому что внутри whereHas не получает мой повернутый атрибут от моей модели пользователя:

Это мой запрос

DB::raw("*, ( 
        3959 * acos( 
        cos(radians(?)) 
        * cos(radians(latitude))
        * cos(radians(longitude) - radians(?)) 
        + sin(radians(?)) 
        * sin(radians(latitude)))
    ) AS distance"))
->having('distance', '<', $distance)
->orderBy("distance")
->setBindings([$lat, $lng, $lat])
->whereHas('user', function($q) {
    $q->whereBetween('date_of_birth',array(Input::get('age_from'),Input::get('age_to')))
      ->where('gender',Input::get('gender'))
      ->where('title','LIKE','%'.Input::get('title').'%');
})
->with('user')
->get();

Модель пользователя

<?php namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

    public function getDateOfBirthAttribute()
    {
        $ca = \Carbon\Carbon::parse($this->attributes['date_of_birth']);

        return $ca->diffInYears();
    }

}

Модель местоположения

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Location extends Model {

    protected $table = 'locations';

    public function user()
    {
        return $this->belongsTo('App\User');
    }

} 

Поле даты рождения в запросе не получает преобразованное значение в лет, а получает значение в формате даты, таком как ГГГГ-ММ-ДД, как в таблице.

  • 0
    Как выглядит поле DOB?
  • 0
    Тип DOB в базе данных - «дата», а в запросе берется формат даты, а не число лет пользовательской модели. Таким образом, запрос не отправляет никакой ошибки, но сравнивает age_from и age_to (числа) с YYYY-DD-MM.
Теги:
eloquent
laravel-5

1 ответ

0
Лучший ответ

Я нашел решение, но не было необходимости доступа к атрибуту из другой модели, просто используйте это whereBetween.

$q->whereBetween(DB::raw('TIMESTAMPDIFF(YEAR,users.date_of_birth,CURDATE())'),array(Input::get('age_from'),Input::get('age_to')));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню