在 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 个表:ProductsImages

每个产品都有很多图片(通过 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');
    

如果设置正确,您可以执行&lt;img src=" $product-&gt;image-&gt;image_url "&gt; 之类的操作来显示产品图片。这假设每个产品只有一张图片。

在你的迁移中,比如在你的product_images 表迁移中,你应该写$table-&gt;foreignId('product_id')-&gt;constrained();,Laravel 会自动知道在哪里寻找相应的图像条目。

【讨论】:

感谢您的解释!当您有多个图像链接到同一个 product_id 但只返回找到的第一个图像行而不返回其余图像时,您将如何解决该问题(图像将是:order by 'created_at' ASC LIMIT 1)。 如果每个product 行有多个product_image,那么我会将上述产品关系从hasOne 更新为hasMany,您可以调用$product-&gt;images::first()。我相信这就是它的工作原理,我还没有测试过,请注意,但这应该是粗略的想法

以上是关于在 Laravel 中,直接从视图向模型或控制器请求一些数据的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥模型在MVC模式中直接更新视图?

如何从 laravel 框架中的模型中的表中获取数据并直接在视图中使用?

Laravel 布局问题

如何从多个控制器获取数据到 Laravel Blade 视图中?

Laravel 函数属于模型或控制器

如何laravel视图里访问其他控制器的路由