Как присоединиться к таблицам laravel, чтобы получить непересекающиеся данные

в моем приложении Laravel у меня есть 3 таблицы: users, documents и type_documents, у пользователя есть несколько документов, а документ имеет один type_document

| Documents       | 
| --------        |
| id              | 
| file            | 
| type_document_id| 
| user_id         | 

| type_documents | 
| --------       |
| id             | 
| name           | 

| users          | 
| --------       |
| id             | 
| name           | 
| type_document_d| 

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

$document_types = TypeDocument::leftJoin('docments' , function ($join) {
                    $join->on('type_documents.id', '=', 'douments.type_document_id')
                         ->where('documents.user_id', auth()->id());
                })
                ->applyFilters($request->all())
                ->latest()
                ->paginateData($limit);

Я использую Laravel версии 8.

Вы определили метод отношения между TypeDocument и пользовательскими моделями?

N69S 23.11.2022 12:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проверьте это решение

TypeDocument::whereNotIn('id', function($query){

    $query->select('type_document_id')
    ->from(with(new Documents)->getTable())
    ->where('type_document_id', $query->id)
    ->where('user_id', auth()->id());
        
})->get();

Я получил undefined property id в `->where('type_document_id', $query->id)`

MAHA OUEGHLANI 23.11.2022 13:45
Ответ принят как подходящий

Вы пробовали whereNotExists() или whereNotIn() вместо leftJoin()?

например:

<?php
// whereNotIn
$types = TypeDocument::whereNotIn('id', function($query) {
    $query->select('type_document_id')
          ->from('documents')
          ->where('user_id', auth()->id);
})->get();
<?php
// whereNotExists
$types = TypeDocument::whereNotExists(function($query) {
    $query->select(DB::raw(1))
          ->from('documents')
          ->whereRaw('type_documents.id = documents.type_document_id')
          ->where('user_id', '=', Auth::user()->id);
})->get();
<?php
// leftJoin
$types = TypeDocument::leftJoin('documents', function($join) {
    $join->on('type_documents.id', '=', 'documents.type_document_id')
         ->where('user_id', '=', Auth::user()->id);
})->whereNull('documents.type_document_id')->get();

попробуйте любой из них!

Спасибо, первое решение с whereNotIn отлично работает :)

MAHA OUEGHLANI 23.11.2022 13:45

Я рад, что это сработало для вас :)

Erhan URGUN 23.11.2022 14:07

Используя Eloquent отношение, определенное между TypeDocument::class и User::class следующим образом:

ТипДокумент.php

public function users()
{
    return $this->belongsToMany(User::class, 'documents', 'type_document_id', 'user_id')->withPivot('file');
}

Вы можете легко получить документ типа, не связанный с конкретным пользователем, как этот

TypeDocument::whereDoesntHave('users', function($userQuery) {
        $userQuery->where('users.id', '=', auth()->id());
    })  
    ->applyFilters($request->all())
    ->latest()
    ->paginateData($limit);

--------------РЕДАКТИРОВАТЬ--------------

ЕСЛИ вы хотите использовать двухступенчатое отношение, вы можете определить его следующим образом:

ТипДокумент.php

public function documents()
{
    return $this->hasMany(Document::class);
}

Документ.php

public function user()
{
    return $this->belongsTo(User::class);
}

И используйте отношения, чтобы запросить его следующим образом:

TypeDocument::whereDoesntHave('documents.user', function($userQuery) {
        $userQuery->where('users.id', '=', auth()->id());
    })  
    ->applyFilters($request->all())
    ->latest()
    ->paginateData($limit);

Это не отношения «многие ко многим». Между typ_document и пользователем нет связи.

MAHA OUEGHLANI 23.11.2022 13:47

@MAHAOUEGHLANI Структура, которую вы имеете, имеет отношение многие ко многим. две таблицы с идентификатором и еще одна сводная таблица с ДВУМЯ внешними идентификаторами для двух других таблиц. это определение сводной таблицы. в любом случае, отношения должны работать независимо. вы также можете определить двухступенчатые отношения, вместо этого имеет много и принадлежит.

N69S 23.11.2022 14:06

@MAHAOUEGHLANI разница между использованием отношений и решением Эрхана заключается в том, что он выполняет только один запрос с соединениями вместо двух запросов с одним вложенным.

N69S 23.11.2022 14:11

Я уже определил ваше второе решение (с двумя отношениями), и оно также работает, спасибо за ваше объяснение :)

MAHA OUEGHLANI 24.11.2022 08:50

oui klemek shih ama b logique un user gére des document non pas des typed_document heka3leh khdemtHa hekek ken na3melha pivot ma3ach nefhemha tdakhalni ba3dhi

MAHA OUEGHLANI 24.11.2022 09:24

Другие вопросы по теме

Похожие вопросы