в моем приложении 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::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)`
Вы пробовали 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
отлично работает :)
Я рад, что это сработало для вас :)
Используя 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 и пользователем нет связи.
@MAHAOUEGHLANI Структура, которую вы имеете, имеет отношение многие ко многим. две таблицы с идентификатором и еще одна сводная таблица с ДВУМЯ внешними идентификаторами для двух других таблиц. это определение сводной таблицы. в любом случае, отношения должны работать независимо. вы также можете определить двухступенчатые отношения, вместо этого имеет много и принадлежит.
@MAHAOUEGHLANI разница между использованием отношений и решением Эрхана заключается в том, что он выполняет только один запрос с соединениями вместо двух запросов с одним вложенным.
Я уже определил ваше второе решение (с двумя отношениями), и оно также работает, спасибо за ваше объяснение :)
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
Вы определили метод отношения между TypeDocument и пользовательскими моделями?