Laravel как определить отношения на основе двух моделей или столбцов? - PullRequest
2 голосов
/ 11 июля 2020

У меня есть следующее:

//users table
id
name
email
remeber_token
role_id
//roles table
id
name
//products table
id
name
//product_prices 
role_id
product_id
price

Цена продукта будет варьироваться в зависимости от роли пользователя, как определить правильные отношения, чтобы в лезвии я мог сделать что-то вроде:

$product->price

, и это вернет правильную цену в зависимости от пользователя и продукта?

1 Ответ

0 голосов
/ 11 июля 2020

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

Самый простой подход - определить отношения HasOne в модели продукта:

class Product
{
    public function price()
    {
        return $this->hasOne(Price::class)->where('role_id', auth()->user()->role_id)
    }
}

Итак, в представлении вы можете просто сказать:

// Lets use optional() because there may not be any price for that product and user.
optional($product->price)->price

Если задействовано много продуктов, то использование подзапросов будет иметь больше смысла.

class ProductsController extends Controller
{
    public function index()
    {
        $products = Product::addSelect(['right_price' => Price::select('price')
            ->whereColumn('product_id', 'products.id')
            ->where('role_id', auth()->user()->role_id)
            ->limit(1)
        ])->get()

        return view('products.index', compact('products'));
    }
}

А затем в представлении:

@foreach($products as $product)
    <p>{{$product->right_price}}</p>
@endforeach

Для получения дополнительной информации, пожалуйста, ознакомьтесь с этой статьей .

...