如何关联Downloads、Products、Users表并在视图展示数据?
解决方案
1. 给Downloads模型添加关联关系
在Downloads模型中定义与User和Product的关联:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Downloads extends Model { // 关联下载记录所属用户 public function user() { return $this->belongsTo(User::class); } // 关联下载记录对应的产品 public function product() { return $this->belongsTo(Product::class); } }
2. 控制器中预加载关联数据
修改控制器的index方法,使用with()预加载关联模型,避免多次查询数据库的性能问题:
public function index() { return view('nav/index', [ 'trendings' => Template::orderBy('views', 'DESC')->where('is_active', 'yes')->take(8)->get(), 'latests_downloads' => Downloads::orderBy('id', 'DESC') ->with(['user', 'product']) // 一次性加载关联的用户和产品数据 ->take(8) ->get(), ]); }
3. 调整视图展示代码
现在每条下载记录实例都包含了关联的user和product对象,直接在循环中调用属性即可:
@foreach ($latests_downloads as $download) <div class="product_title"> {{ $download->product->name }} </div> <div class="who_downloaded"> {{ $download->user->name }} </div> @endforeach
补充提示
如果存在用户或产品被删除的情况,可以给关联添加withDefault()避免页面报错:
public function user() { return $this->belongsTo(User::class)->withDefault(['name' => '匿名用户']); } public function product() { return $this->belongsTo(Product::class)->withDefault(['name' => '已下架产品']); }
内容的提问来源于stack exchange,提问作者Vai
相关产品推荐
相关产品推荐

