我怎样才能与 Eloquent 关系做到这一点
How can I do this with Eloquent Relationship
我正在开发一个在线商店项目,我想创建添加到收藏夹 系统,以便用户将他们喜欢的产品添加到他们的收藏夹列表中。
所以我创建了一个名为 favourite_products
的 table,它是这样的:
所以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');
}
现在我想从这个 table 中获取所有数据。
所以我尝试将其添加到控制器中:
public function index()
{
$favouriteProducts = FavouriteProduct::all();
return view('admin.shop.favourites.all', compact('favouriteProducts'));
}
然后在 Blade:
@foreach($favouriteProducts as $fav_pro)
@php
$member_info = \App\User::where($fav_pro->usr_id)->first();
$product_info = \App\Shop\Product::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
但我想知道,如何通过用户和产品模型关系检索 usr_name
& prd_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
所以问题是,如何在具有用户或产品多对多关系的 table 中显示来自 favourite_products
的所有结果?
当您使用枢轴模型时,您可以在 FavouriteProduct
模型中添加这些关系:
public function user()
{
return $this->belongsTo(User::class, 'usr_id');
}
public function product()
{
return $this->belongsTo(Product::class, 'prd_id');
}
现在在您的 blade 文件中:
@foreach($favouriteProducts as $fav_pro)
<tr class="closest-tr">
<td>{{ ++$menuCounter }}</td>
<td>{{ $fav_pro->user->usr_name }}</td>
<td>{{ $fav_pro->product->prd_name }}</td>
</tr>
@endforeach
也不要忘记将 with
添加到控制器中的查询中
public function index()
{
$favouriteProducts = FavouriteProduct::with('product', 'user')->all();
return view('admin.shop.favourites.all', compact('favouriteProducts'));
}
获取所有数据(产品和喜欢该产品的用户)获取与他们相关的用户的所有产品
$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
然后在你blade你可以循环他们
@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
我正在开发一个在线商店项目,我想创建添加到收藏夹 系统,以便用户将他们喜欢的产品添加到他们的收藏夹列表中。
所以我创建了一个名为 favourite_products
的 table,它是这样的:
所以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');
}
现在我想从这个 table 中获取所有数据。
所以我尝试将其添加到控制器中:
public function index()
{
$favouriteProducts = FavouriteProduct::all();
return view('admin.shop.favourites.all', compact('favouriteProducts'));
}
然后在 Blade:
@foreach($favouriteProducts as $fav_pro)
@php
$member_info = \App\User::where($fav_pro->usr_id)->first();
$product_info = \App\Shop\Product::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
但我想知道,如何通过用户和产品模型关系检索 usr_name
& prd_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
所以问题是,如何在具有用户或产品多对多关系的 table 中显示来自 favourite_products
的所有结果?
当您使用枢轴模型时,您可以在 FavouriteProduct
模型中添加这些关系:
public function user()
{
return $this->belongsTo(User::class, 'usr_id');
}
public function product()
{
return $this->belongsTo(Product::class, 'prd_id');
}
现在在您的 blade 文件中:
@foreach($favouriteProducts as $fav_pro)
<tr class="closest-tr">
<td>{{ ++$menuCounter }}</td>
<td>{{ $fav_pro->user->usr_name }}</td>
<td>{{ $fav_pro->product->prd_name }}</td>
</tr>
@endforeach
也不要忘记将 with
添加到控制器中的查询中
public function index()
{
$favouriteProducts = FavouriteProduct::with('product', 'user')->all();
return view('admin.shop.favourites.all', compact('favouriteProducts'));
}
获取所有数据(产品和喜欢该产品的用户)获取与他们相关的用户的所有产品
$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
然后在你blade你可以循环他们
@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