Отображение красноречивых отношений в Laravel - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь отображать заказы продавцам, но покупатели также могут видеть их заказы. Я создал все необходимые отношения и данные в базе данных. Я застрял в попытке запросить эти данные из базы данных, чтобы я мог показать это. У меня есть эти таблицы заказов таблицы, таблицы order_product. Вот как они выглядят https://imgur.com/a/Ud9e2Hh

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

Вот мои функции

// Seller Orders 
 public function viewOrders(User $user)
 {
 // all sells
 $sells = $user->allOrderFromSellers();
 dd($sells);// this returns empty array
 return view('orders')->with(compact('sells'));
 }


 //Buyer Orders
 public function myOrders(User $user)
 { 

  return view('myOrders', compact('user','orders'));
  dd($orders);
 }

А вот и модели.

 order_product.php

 <?php
 namespace App;
 use Illuminate\Database\Eloquent\Model;

 class OrderProduct extends Model
 {
 protected $table = 'order_product';
 protected $fillable = ['order_id', 'buyer_id',  'seller_id','product_id', 'quantity'];

 public function products()
 {
  return $this->belongsTo('App\Products_model');
 }

 public function buyer()
 {
    return $this->belongsTo(User::class, 'id', 'buyer_id');
 }

 public function seller()
 {
    return $this->belongsTo(User::class, 'id', 'seller_id');
 }

 public function order()
 {
  return $this->belongsTo(Order::class);
 }
 }

и это User.php

 <?php
 namespace App;
 use Illuminate\Notifications\Notifiable;
 use Illuminate\Contracts\Auth\MustVerifyEmail;
 use Illuminate\Foundation\Auth\User as Authenticatable;

 class User extends Authenticatable
 {
 use Notifiable;

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
 protected $fillable = [
    'name', 'email', 'password', 'Seller'
 ];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
 protected $hidden = [
    'password', 'remember_token', 
 ];

//public function isSeller() {
 //   return $this->seller;
//}

 public function products()
 {
  return $this->hasMany(Products_model::class);
 }
/**
 * The attributes that should be cast to native types.
 *
 * @var array
 */
 protected $casts = [
    'email_verified_at' => 'datetime',
 ];

 public function orders()
 {
   return $this->hasManyThrough(Order::class,     Products_model::class, 'buyer_id', 'seller_id', 'product_id');
 }

 public function orderFromBuyers()
 {
  return $this->hasManyThrough(OrderProduct::class,    Products_model::class, 'buyer_id', 'product_id');
 }

 public function orderFromSellers()
 {
    return $this->hasManyThrough(OrderProduct::class, Products_model::class, 'seller_id', 'product_id');
 }

 public function allOrderFromBuyers()
 {
 return $this->hasMany(OrderProduct::class, 'buyer_id');
 }


 public function allOrderFromSellers()
 {
 return $this->hasMany(OrderProduct::class, 'seller_id');
 }

 }

вышеупомянутые функции дают мне эту коллекцию как результат:

"Collection {#281 ▼
    #items: []
}"

Пожалуйста, помогите мне в этом, я потратил так много времени, но ничего не работает.

1 Ответ

0 голосов
/ 18 июня 2019

Неверные отношения Вам нужно использовать много ко многим и имеет много сквозных отношений, так как в заказе много продуктов, а в продукте много заказов ... https://laravel.com/docs/5.8/eloquent-relationships#many-to-many https://laravel.com/docs/5.8/eloquent-relationships#has-many-through Не создавать модель и отношения для сводной таблицы как OrderProduct Это не правильно В этом случае order_product является сводной таблицей

Так что это правильные модели

Для заказа модели

public function products() 
{
    return $this->belongsToMany('App\Product', 'order_product');
}

Для модели товара

public function orders() 
{
   return $this->belongsToMany('App\Order', 'order_product');
}

После этого вы можете обращаться с остальными вещами

$order = Order::with('products')->findOrFail($id);
$products = $order->products

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