Красноречивые отношения laravel с и где предложение на основе внешнего столбца

Привет, я хочу получить свой projects, хранящийся в БД, который принадлежит авторизации user, который также создает clients (у них много проектов и задач) и tasks (принадлежит проекту, задачам и пользователю).

Я хочу получить все задачи, которые не помечены как закрытые в таблице состояния, я знаю, что это идентификатор 2, и я могу получить это так:

public function getOpenProjects() {

    return \Project::with(['clients', 'tasks', 'status'])
        ->where('status_id', '!=', '2')
        ->whereUserId(Auth::user()->id)
        ->get();
}

Но как я могу изменить это, чтобы запросить столбец в таблице статусов, то есть столбец имени в этой таблице?


person 001221    schedule 11.09.2014    source источник


Ответы (2)


Вы можете попробовать это:

$value = 'someName';
Project::with(['clients', 'tasks', 'status' => function($q) use($value) {
    // Query the name field in status table
    $q->where('name', '=', $value); // '=' is optional
}])
->where('status_id', '!=', '2')
->whereUserId(Auth::user()->id)
->get();

Также вы можете попробовать это (он будет извлекать записи, только если query возвращает name, который вы хотите, в противном случае нет):

$value = 'someName';
Project::with(['clients', 'tasks', 'status'])
       ->whereHas('status', function($q) use($value) {
       // Query the name field in status table
       $q->where('name', '=', $value); // '=' is optional
})
->where('status_id', '!=', '2')
->whereUserId(Auth::user()->id)
->get();
person The Alpha    schedule 11.09.2014
comment
Я хочу запросить поле имени таблицы состояния, а не таблицу проектов - person 001221; 12.09.2014
comment
Да, это $q->where('name', '=', $value) внутри closure, которое является значением status. - person The Alpha; 12.09.2014
comment
почему он получает статус с нулевым значением? - person 001221; 12.09.2014
comment
У вас есть заявление select? Вероятно, у вас нет никакого статуса с этим именем. - person The Alpha; 12.09.2014
comment
Я делаю, хотя, возьмем, например, проект имеет имя_проекта Open, но все еще извлекается: {id: 115, user_id: 1, client_id: 69, status_id: 2, project_name: Open, client: {id: 69, user_id: 1 ,client_name: A Arcu Sed Associates, }, статус: null}] и у меня также есть открытые статусы - person 001221; 12.09.2014
comment
Вы хотите exclude т.е. where != 'Open' ? - person The Alpha; 12.09.2014
comment
Кстати, я не включил where('status_id', '!=', '2'), так как хочу избежать его указания таким образом, поскольку на самом деле идентификатор может быть чем угодно. - person 001221; 12.09.2014
comment
Чтобы исключить его, вы можете использовать $q->where('name', '!=', $value);, update. - person The Alpha; 12.09.2014
comment
Нет, я хочу получить открытые проекты. Open — это имя статуса в таблице статусов. - person 001221; 12.09.2014
comment
Метод -›whereHas() был тем, что мне было нужно, чтобы заставить это работать. Благодарю вас! - person Erin Geyer; 06.03.2018
comment
Рад узнать, что @MiftahAfina :-) - person The Alpha; 08.02.2019

Вы можете попробовать это:

Project::with(['clients', 'tasks' => function($q) use($value) {
// Query the name field in status table
    $q->where('status_id', '!=', '2'); 
}])
->whereUserId(Auth::user()->id)
->get();
person Md Shahadat Hossain    schedule 08.09.2016
comment
Что, если я хочу запустить предложение where для таблицы «клиенты» вместе с этим $q-›where('status_id', '!=', '2'); - person leaveme_alone; 14.04.2020