красноречиво с () в нескольких выражениях where () - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь отфильтровать результаты таблицы отношений.

public function read_projects_by_coords(Request $request)
{

    $from_lat = $request->get("from_lat");
    $to_lat = $request->get('to_lat');
    $from_lng = $request->get('from_lng');
    $to_lng = $request->get('to_lng');

    $projects = Project::with(["details" => function($query) use ($from_lat, $from_lng, $to_lat, $to_lng){
        return $query->where("details.lat", ">", $from_lat)
                     ->where("details.lat", "<", $to_lat)
                     ->where("details.lng", ">", $from_lng)
                     ->where("details.lng", "<", $to_lng);
    }])->get();

    return response()->json($projects);
}

Но когда я запускаю приведенный выше details(child) с пустым / нулевым результатом и родительская таблица / таблица проекта не фильтруется. Я возвращаю все ...

Например $projects = Project::with(["details"])->get(); это работает без проблем. Но когда я пытаюсь отфильтровать модель проекта с помощью where внутри with(), я не могу получить записи объекта detail, а родительский элемент не фильтруется.

для всех, кто хочет увидеть модели родитель и ребенок

class Project extends Model
{
    protected $table = "projects";
    protected $guarded = [];
    protected $with = ["details"];

    public function details(){
        return $this->hasOne("App\Models\Detail");
    }
}

class Detail extends Model
{
    protected $table = "details";
    protected $guarded = [];

    public function project(){
        return $this->belongsTo("App\Models\Project");
    }
}

Что мне не хватает?

1 Ответ

1 голос
/ 09 июля 2020

Чтобы отфильтровать таблицу Project, чтобы выбрать только те, у которых некоторые Details соответствуют вашим параметрам, вам нужно использовать whereHas. Вам также необходимо сохранить свое предложение with, чтобы свойство details было правильно заполнено.

Я бы использовал обратный вызов, чтобы не повторять те же условия

$callback = function($query) use ($from_lat, $from_lng, $to_lat, $to_lng) {
  $query->where("lat", ">", $from_lat)
    ->where("lat", "<", $to_lat)
    ->where("lng", ">", $from_lng)
    ->where("lng", "<", $to_lng);
}

$projects = Project::with(['details' => $callback])
    ->whereHas('details', $callback)
    ->get();

return response()->json($projects);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...