Laravel Архитектура, несколько похожих моделей для объединения? - PullRequest
0 голосов
/ 25 января 2020

У меня есть приложение laravel с продуктами, которые могут быть связаны с кавычками.

У меня проблема в том, что цитата почти такая же, как заказ

Так что, когда цитата Я принимаю все значения из цитаты в заказ и заново связываю все элементы с заказом вместо цитаты.

Я планировал создать поле типа для заказов и просто изменить тип с цитаты на заказ, но это затрудняет выполнение красноречивых запросов о взаимосвязях продуктов, таких как ..

Чтобы определить, продан ли продукт: Products :: has ('order');

Как правильно поступить реализовать этот дизайн?

Ответы [ 2 ]

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

Если вы хотите сохранить и порядок, и кавычки, вы можете создать несколько NN-отношений или один NN-полиморф c release

product 1-N quote N-1 order_data
product 1-N order N-1 order_data

Order_data содержит всю информацию о заказе. Таблица котировок и заказов, определяющая тип заказа.

Если вы планируете также вводить другие виды запросов клиентов, такие как кредитные заметки и другие дополнительные. Вам следует подумать о создании отношения полиморф c.

Product 1-N order_type N-N order_data
  • Продукт: содержит информацию о продукте
  • Данные_порядка: представляют разные входные данные клиента
  • Тип_заказа: разные отношения заказа

Вы можете создать данные заказа с несколькими выпусками. Таким образом, котировки orderType, order и credit могут существовать одновременно, что важно для документации.

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

Вы можете сделать это, применив дополнительные ограничения на отношения.

class Product extends Model
{
    /**
     * Get the orders for the product.
     */
    public function orders()
    {
        return $this->hasMany('App\Order')->where('type', '=', 'order');
    }

    /**
     * Get the quotes for the product.
     */
    public function quotes()
    {
        return $this->hasMany('App\Order')->where('type', '=', 'quote');
    }
}

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

Product::has('quotes');
Product::has('orders');

Если вы не Если вы не хотите писать дополнительные ограничения в методе отношений, добавляется только отношение orders(), тогда при необходимости можно использовать метод whereHas().

$orders = Product::whereHas('orders', function (Builder $query) {
    $query->where('type', '=', 'order');
})->get();


$orders = Product::whereHas('orders', function (Builder $query) {
    $query->where('type', '=', 'quote');
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...