Laravel查询多个表

时间:2016-11-21 11:39:50

标签: laravel eloquent

使用Laravel 5.3,我有一个数据库,包括由数据透视表product_wishlist连接的用户,产品和愿望清单。架构如下:

USERS          WISHLISTS     PRODUCTS        PRODUCT_WISHLIST
-------------  -------------  --------------  ---------------
id             id             id              product_id
name           name           name            wishlist_id
               user_id        

在App / Wishlist.php中

public function products()
{
    return $this->belongsToMany(Product::class, 'product_wishlist');
}

public function owner()
{
    return $this->belongsTo(User::class);
}

在App / product.php中

public function wishlists()
{
    return $this->belongsToMany(Whishlist::class, 'product_wishlist');
}

用户可以创建愿望清单并将产品添加到愿望清单。

在产品页面中,我正在尝试显示已登录用户的所有愿望清单。

$wishlists = Auth::user()->wishlists;

但是如果每个心愿单都包含产品,我也想要回复(只有在不包含产品的情况下,我才会在每个心愿单附近添加“添加到心愿单”按钮)。

我在Kabelo回答后编辑:

我想要的是显示单个产品页面,并在侧边栏中显示已登录用户的所有愿望清单(每个用户都有您自己的愿望清单):wishlist1(添加到列表),wishlist2(添加到列表),...但是,例如,如果此页面的产品已经在wishlist2中,则不显示“(添加到列表)”。在这些情况下,我可以显示“(从列表中删除)”

1 个答案:

答案 0 :(得分:2)

  

用户可以创建心愿单并将产品添加到愿望清单。

从您的问题,我看到用户可以创建多个愿望清单,这是实现这一目标的一种方式。

在App / Wishlist.php中

class Wishlist extends Model
{
    /**
     * Get all of the products for the wishlist.
     */
    public function products()
    {
        return $this->belongsToMany('App\Product', 'product_wishlist');
    }

    /**
    * Get owner/creator of wishlist.
    */
    public function owner()
    {
        return $this->belongsTo('App\User');
    }

}

在App / Product

class Product extends Model
{
    /**
     * Get the wishlists for the product.
     */
    public function wishlists()
    {
        return $this->belongsToMany('App\Wishlist', 'product_wishlist');
    }

}

在控制器功能

$products = App\Products::with(['wishlist'=> function($query){
    $query->where('user_id', Auth::user()->id);
}])->get();
return view('product.index', compact('products'))

在views / product / index.blade.php

@foreach( $products as $product )

    <div class="product">
        <h3>{{ $product->name }}</h3>
        @if( ! count($product->wishlists) )
            <button>Add to wishlist</button>
        @endif
    </div>

@endforeach



  

单品页面

上显示

在控制器

public function show($id){
    $_product = App\Products::where('id', $id)->first();
    $wishlists = null;
    $product_is_in_wishlist = false;
    if(Auth::check()){
        $wishlists = App\Wishlists::where('user_id', Auth::user()->id)
            ->with('products')->get();
        foreach( $wishlists as $wishlist ){
            if( $wishlist->products->where('id', $_product->id)->count() ){
                $product_is_in_wishlist= true;
            }
        }
    }

    return view('product.show', compact('_product', 'wishlists', 'product_is_in_wishlist'));
}

在view / product / show.blade.php

<div id='product_container'>
    <h1>{{ $_product->name }}</h1>
    @if( $product_is_in_wishlist )
        <button>Remove from wishlist</button>
    @else
        <button>Add to wishlist</button>
    @endif
</div>
<div id='wishlists_sidebar'>
    <ul>
        @foreach( $wishlists as $wishlist)
            <li>{{ $wishlist->name }}</li>
        @endforeach
    </ul>
</div>