How to query Seller Id from Products table in data

2019-08-22 03:29发布

I'm working on a project where users can sell and also buy products, and in my database there are two tables(orders and order products table)in orders tables there's a buyer_id and seller_id. So if a user buys product it shows buyer_id now the problem comes to seller_id. It doesn't show the seller_id.

Here is my code.

User.php

 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()
 {
  $this->hasManyThrough(OrderProduct::class, Products_model::class, 'buyer_id', 'product_id');
 }

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

Products_model.php

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

class products_model extends Model
{
protected $table='products';
protected $primaryKey='id';
protected $fillable= ['seller_id','pro_name','pro_price','pro_info','image','stock','category_id'];
}

OrderProduct.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');
 }
  }

Order.php

 <?php
 namespace App;
 use Illuminate\Database\Eloquent\Model;
 class Order extends Model
 {
//protected $table = 'orders';
protected $fillable =  [
    'shipping_email', 'shipping_name', 'shipping_city', 'shipping_phone', 'billing_subtotal', 'billing_total',
];

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

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

 public function orders(){
     return $this->hasMany('App\OrderProduct', 'order_id');
 }

My store Function

  public function store(Request $request)
   {
    //Insert into orders table
    $order = Order::create([
        'buyer_id' => auth()->user() ? auth()->user()->id : null,
        'shipping_email' => $request->email,
        'shipping_name' => $request->name,
        'shipping_city' => $request->city,
        'shipping_phone' => $request->phone,
       // 'error' => null,
    ]);

    //Insert into order product table
    if ($order) {
        foreach(session('cart')  as $productId =>$item) {
           if (empty($item)) {
               continue;
           }
           OrderProduct::create([
            'order_id' => $order->id ?? null,
            'product_id' => $productId,
           // $products=DB::table('products')->where('id',$id)->get();
            'quantity' => $item['quantity'],
            //dd($item)
        ]);
       }
    }

CheckoutController(function)

    public function store(Request $request)
     {
    //Insert into orders table
    $order = Order::create([
        'buyer_id' => auth()->user() ? auth()->user()->id : null,
        'seller_id' => auth()->user() ? auth()->user()->id : null,            'shipping_email' => $request->email,
        'shipping_name' => $request->name,
        'shipping_city' => $request->city,
        'shipping_phone' => $request->phone,
       // 'error' => null,
    ]);

    //Insert into order product table
    if ($order) {
        foreach(session('cart')  as $productId =>$item) {
           if (empty($item)) {
               continue;
           }
           OrderProduct::create([
            'order_id' => $order->id ?? null,
            'product_id' => $productId,
           // $products=DB::table('products')->where('id',$id)->get();
            'quantity' => $item['quantity'],
            //dd($item)
        ]);
       }
    }

   //Empty Cart After  order created
    $cart = session()->remove('cart');
     return redirect()->route('confirmation.index')->with('success_message', 'Thank you! Your payment has been successfully accepted!');
     }

ProductController(function)

    public function viewOrders(User $user)
  {

        $products = Products_model::where('seller_id', '=', $user->id)->get();
        // all sells
        $sells = $user->sells;
        // all buys
        $buys = $user->buys;

    }
    //dd( $products);
    return view('orders')->with(compact('orders'));

My View File(blade)

  @foreach($sells as $sell) 
<tr>
  <td>{{$sell->orders}}</td>
  <td>{{$sell->products}}</td>
  @foreach($sell->orders as $order)
  <td>{{$order->created_at}}</td>
  <td>{{$order->shipping_name}}</td>
  <td>{{$order->shipping_city}}</td>
  <td>{{$order->shipping_phone}}</td>
  <td>
    <a href="">View Order Details</a>
  </td>
</tr>
@endforeach
@endforeach

3条回答
劫难
2楼-- · 2019-08-22 03:48

Add this to OrderProduct.php

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

Update product Controller

 public function viewOrders(User $user)
  {

      // $products = Products_model::where('seller_id', '=', $user->id)->get();
      // all sells
      $sells = $user->orderFromSellers;
      return view('orders')->with(compact('sells'));

  }
  //dd( $products);

Update your view to,

 @foreach($sells as $sell) 
    <tr>
        <td>{{$sell->orders}}</td>
        <td>{{$sell->products}}</td>
        <td>{{$sell->created_at}}</td>
        <td>{{$sell->order->shipping_name}}</td>
        <td>{{$sell->order->shipping_city}}</td>
        <td>{{$sell->order->shipping_phone}}</td>
        <td>
            <a href="">View Order Details</a>
        </td>
    </tr>
@endforeach

On CheckoutController (store) update to,

public function store(Request $request)
     {
    //Insert into orders table
    $order = Order::create([          
        'shipping_email' => $request->email,
        'shipping_name' => $request->name,
        'shipping_city' => $request->city,
        'shipping_phone' => $request->phone,
       // 'error' => null,
    ]);

//Insert into order product table
if ($order) {
    foreach(session('cart')  as $productId =>$item) {
       if (empty($item)) {
           continue;
       }
       OrderProduct::create([
        'buyer_id' => auth()->user() ? auth()->user()->id : null,
        'seller_id' => $products=DB::table('products')->find('productId')? $products=DB::table('products')->find('productId')->seller_id : null,  
        'order_id' => $order->id ?? null,
        'product_id' => $productId,
       // $products=DB::table('products')->where('id',$id)->get();
        'quantity' => $item['quantity'],
        //dd($item)
    ]);
   }
}

   //Empty Cart After  order created
    $cart = session()->remove('cart');
     return redirect()->route('confirmation.index')->with('success_message', 'Thank you! Your payment has been successfully accepted!');
     }
查看更多
闹够了就滚
3楼-- · 2019-08-22 03:52

Let's see if we can find probably the easiest solution. I can see from your product model that it has a seller_id field. When you are looping over the products to display them, why don't you use a hidden input which has a value of seller_id? i.e.

@foreach ( $products as $product )
  <form> // assuming you will be creating a form for the buy button
     <input type="hidden" value={{ $product->seller_id }} />
     <button type="submit">Buy Now</button>
  </form>
@endforeach

Now in your Controller, you will have access to seller_id as

$seller_id = request('seller_id');

hope that helps

查看更多
不美不萌又怎样
4楼-- · 2019-08-22 03:55

There is an issue that is every product must have a seller. If then, you should use buyer and seller relation with OrderProduct model not Order model. Or you may collect seller by make relation with product-seller.

First

remove 'buyer_id', 'seller_id', from Order model and orders migration.

Second

Add 'buyer_id', 'seller_id', from OrderProduct model and order_product migration.

Third

Transfer relation buyer and seller from Order model to OrderProduct model

Fourth

When you create the OrderProduct data, you add buyer_id and seller_id. Finally catch and use them as you want.

Fifth

Dont forget to update buys and sells relation Order model to OrderProduct model on User model.

Sixth

you have to updatye orders relation on User model. It should be ,

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

Note that, You cannot make them from one function. Finally update any other things relation to these changes.

查看更多
登录 后发表回答