在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是啥?
Posted
技术标签:
【中文标题】在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是啥?【英文标题】:In Laravel, what is the best way to request some data from a Model or Controller directly from the View?在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是什么? 【发布时间】:2020-12-08 04:01:52 【问题描述】:我有 2 个表:Products 和 Images。
每个产品都有很多图片(通过 product_id 外键)
*product_id, product_title*
1, "Product 1"
2, "Product 2"
3, "Product 3"
4, "Product 4"
*image_id, product_id(foreign key), image_url, created_at*
25, 1, "/filename_xyz", '5:00'
26, 1, "/filename_abc", '5:30'
27, 2, "/filename_def", '6:30'
28, 1, "/filename_abc", '7:00'
29, 3, "/filename_def", '8:00'
我有一个控制器可以将所有产品返回到我的视图中。
ProductController.php
public function index()
$data_to_return = Product::orderby('product_id', 'DESC')->paginate(10);
return view('product.index', [
'product_data' => $data_to_return,
]);
此控制器正确加载到视图 product.index。
我成功地遍历了刀片文件中的结果,如下所示:
@foreach($product_data as $product)
$product->product_title
<!--however, I would like to also print one of the images linked to a product-->
@endforeach
我在规划图像的“链接”或“加入”时遇到问题。对于 product_id=1 的产品,图像数据库中有多个条目。我希望我的视图能够从 Products 表中获取产品信息,以及从 Images 表中仅获取一个图像(匹配 product_id)。就我而言,我需要由 created_at ASC 订购的第一个结果(或限制 1)。
示例:产品 1 会在我的视图中显示一个“/filename_xyz”的 image_url,因为它是第一个从具有 product_id = 1 的图像创建的
我认为解决方案可能是这样的:
循环产品数组:
@foreach($product_data as $product)
$product->product_title
<!-- And calling a controller like -->
Image::mainImage($product->id)
<!-- Where mainImage returns the image_url I am looking for-->
@endforeach
或
更好地设计我的模型,首先以某种方式加入表格,这完成了我之前提到的只显示我感兴趣的一个图像。我无法弄清楚如何通过最好的 Laravel/Eloquent 实践来实现这一点。
【问题讨论】:
$product->image_url[0] 【参考方案1】:这就是 Eloquent 关系派上用场的地方!
您的模型关系应该类似于此设置;
class Product extends Model
public function image()
return $this->hasOne('your/path/to/image/model');
class ProductImage extends Model
public function product()
return $this->belongsTo('your/path/to/product/model');
如果设置正确,您可以执行<img src=" $product->image->image_url ">
之类的操作来显示产品图片。这假设每个产品只有一张图片。
在你的迁移中,比如在你的product_images
表迁移中,你应该写$table->foreignId('product_id')->constrained();
,Laravel 会自动知道在哪里寻找相应的图像条目。
【讨论】:
感谢您的解释!当您有多个图像链接到同一个 product_id 但只返回找到的第一个图像行而不返回其余图像时,您将如何解决该问题(图像将是:order by 'created_at' ASC LIMIT 1)。 如果每个product
行有多个product_image
,那么我会将上述产品关系从hasOne
更新为hasMany
,您可以调用$product->images::first()
。我相信这就是它的工作原理,我还没有测试过,请注意,但这应该是粗略的想法以上是关于在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 laravel 框架中的模型中的表中获取数据并直接在视图中使用?