我怎样才能用雄辩的关系做到这一点呢?

我正在处理一个在线商店项目,我想创建添加到收藏系统,以便用户将他们喜欢的产品添加到他们的收藏列表中。

所以我创建了一个名为favourite_products的表,其内容如下:

所以usr_id代表用户id,prd_id代表产品id。

这里是User.php型号:

public function favourites()
    {
        return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id')->withTimestamps();
    }

这是Product.php型号:

public function favouritees()
    {
        return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id');
    }

现在我想从此表中获取所有数据。

因此我尝试将此内容添加到控制器:

public function index()
    {
        $favouriteProducts = FavouriteProduct::all();
        return view('admin.shop.favourites.all', compact('favouriteProducts'));
    }

然后在刀片中:

@foreach($favouriteProducts as $fav_pro)
    @php
        $member_info = AppUser::where($fav_pro->usr_id)->first();
        $product_info = AppShopProduct::find($fav_pro->prd_id);
    @endphp 
    <tr class="closest-tr">
        <td>{{ ++$menuCounter }}</td>
        <td>{{ $member_info->usr_name }}</td>
        <td>{{ $product_info->prd_name }}</td>
    </tr>
@endforeach
但是我想知道,我如何通过User和Product Models关系检索usr_name&;prd_name?因此,我不需要在视图中添加Model name并从中获取数据.

我在控制器上尝试了这两个,但都是错误的:

Product::whereHas('favouritees')->get(); // if two different users add same product, it returns only one of them

User::whereHas('favourites')->get(); // if a user add different products, it returns only one of them for the user

所以问题是,我如何才能在具有User或Product多对多关系的表中显示favourite_products的所有结果?


解决方案

若要获取所有数据(产品和喜欢该产品的用户),请获取与其相关的所有产品

$products = Product::whereHas('favouritees')->with('favouritees')->get(); 
// if two different users add same product, it returns only one of them but it will have two users in the relation favouritees

然后您可以在刀片中循环它们

@foreach($products as $product)
    @foreach($product->favouritees as $user)    
        <tr class="closest-tr">
            <td>{{ ++$menuCounter }}</td>
            <td>{{ $user->usr_name }}</td>
            <td>{{ $product->prd_name }}</td>
        </tr>
    @endforeach
@endforeach

相关文章