Как не получить некоторые данные на основе записей в другой таблице с laravel eloquent? - PullRequest
0 голосов
/ 23 января 2020

Вот моя База данных Структура:

Products : ['id','name','image']
Request : ['id','marketer_id','distributor_id']
RequestItems : ['id','request_id','product_id','quantity']

Теперь это лишь краткий пример структуры. то, что я пытаюсь сделать, это то, что у меня есть страница с запросом, которая на этой странице я получаю элементы в базе запросов на таблице RequestItems, и я хочу добавить кнопку на своей странице, чтобы добавить продукт в этот запрос, но я хочу показать продукты, которых нет в RequestItems.

. Я могу поставить условие перед проверкой продукта, чтобы убедиться, что пользователь не добавит 1 продукт 2 раза в запросе, но я также хочу прояснить, что пользователь видит товары в кнопке добавления, которые уже существуют в его элементах запроса.

Мне просто нужна помощь для Query, я разрабатываю с Laravel & vue.js для SPA .

Мое решение (но в поисках лучшего решения):

public function getRequestRepresentativeSideProducts(RepresentativesRequests $id, Request $request){

    $products = DistributorProducts::where(
        'distributor_id', $request->distributor_id
    )
        ->latest()
        ->get();


    $data = $id->items()->latest()->get();

    $myArray = array();

    for ($i = 0; $i < $data->count(); $i++)
    {
        $myArray[] = $data[$i]->product_id;
    }

    return $products->except($myArray);

}

Редактировать 01: Мне удалось получить ответ с помощью запроса ниже, но он принимает все данные

    $data = DistributorProducts::doesntHave('requestRepresentativeSideItems', 'and', function ($query){
        $query->where('representative_request_id', '=', 1);
    })->where('distributor_id', $request->distributor_id)
        ->latest()
        ->get();

    $data = DistributorProducts::whereDoesntHave('requestRepresentativeSideItems', function (Builder $query) use ($id) {
        $query->where('representative_request_id', 'like', $id->id);
    })->where('distributor_id', $request->distributor_id)
        ->latest()
        ->get();

    $data = DistributorProducts::whereDoesntHave('requestRepresentativeSideItems', function (Builder $query) use ($id) {
        $query->where('representative_request_id', $id->id);
    })->where('distributor_id', $request->distributor_id)
        ->latest()
        ->get();

У меня есть 3 продукта для distributor_id, 2 из которых находятся в элементах запроса, поэтому мой запрос должен показывать 1, но будет отображаться над запросом, но я получаю все продукты.

Редактировать 02: я проверил, откуда из $ query и использовал как и C повесил request_id, но результат не изменился. похоже, он просто игнорирует эту часть.

1 Ответ

0 голосов
/ 23 января 2020

Предполагая, что у вас есть идентификатор для Request, который вы хотите отфильтровать, запрос SQL будет примерно выглядеть как

SELECT * FROM `products` WHERE NOT EXISTS 
         (SELECT * FROM `request_items` where `products`.`id` = `product_id` and `request_id` = ? )

Я должен был сделать дополнительное предположение, поскольку вы не указали модель , я бы просто предположил следующее

class Product extends Model
{
     public function requestItems()
     {
       return $this->hasMany(RequestItems::class);
     }
}

class RequestItems extends Model
{
     public function products()
     {
       return $this->belongsTo(Product::class);
     }
}

Тогда мы можем использовать критерии запроса doesntHave , чтобы найти продукты, которые не связаны с RequestItems для данного идентификатора запроса (в данном примере это 1 ).

Products::doesntHave('requestItems', 'and',
                     function($query){ $query->where('request_id', '=', 1); }
                    );

Надеюсь, это поможет. Я не пробовал сам, но я верю, что это сработает. Вы можете использовать метод toSql, чтобы увидеть итоговый запрос SQL.

Примечание: некоторое представление о различиях IN и EXISTS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...