laravel 尝试从控制器访问并返回hasOne到前端时出现错误

h79rfbju  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(125)

Response::setContent():参数#1($content)必须是类型?弦
当我试图从控制器访问hasOne并将其返回到前端时,出现了上述错误。我创建了两个模型产品和图像。
产品型号

<?php

namespace App\Models;

use Exception;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;
    protected $fillable = [
        'sku',
        'name',
        'price',
        'status',
        'imageId'
    ];

    public function images(){
        return $this->hasOne(Image::class,'id','imageId');
    }
}

图像模型

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    use HasFactory;
    protected $fillable = [
        'imageName',
        'imageLink'
    ];
}

产品控制器

<?php

namespace domain\Services;

use App\Models\Product;
use App\Models\Image;
use Exception;
use PhpParser\Node\Stmt\TryCatch;

class ProductService
{
    protected $item;
    public function __construct()
    {
        $this->item = new Product();
    }
    public function all()
    {
            return $this->item->images();
    }

当我尝试使用控制器中的all()函数返回模型中的函数images函数时,出现了错误。

ffscu2ro

ffscu2ro1#

首先,您拥有的是belongsTo关系,因为产品模型有一个ImageId列。https://laravel.com/docs/10.x/eloquent-relationships#one-to-one
你的控制器方法“all”的目的是什么?你想展示你所有的产品与他们的形象?如果是这样,你应该这样做:

return Product::query()
->with('images')
->get();

https://laravel.com/docs/10.x/eloquent-relationships#eager-loading
你可以在水合模型上调用关系。类似于:

Product::first()->images

请注意Portuct::first()->images和Product::first()->images()之间的区别。
就一个小提示。如果它是一对一关系,那么你的关系方法应该命名为image()而不是images()。

pgpifvop

pgpifvop2#

总的来说,Laravel在你利用它的优势时工作得最好。例如,在上面的代码中,你有$imageId而不是$image_id,然后你被迫在Product模型上的关系中包含要搜索的id,而不是使用Laravel所期望的,即在product表中的$image_id。然后在模型中使用

Public function Image()
{
    return $this->hasOne(Image::class);
}

请注意,函数名称与模型名称相同。并且由于您已经在product表中使用了$image_id,因此不需要进一步的操作。
还要考虑调用产品控制器ProductController而不是ProductService
回答你的问题:在产品控制器的构造函数中,你初始化一个新的产品模型,没有任何对数据库的引用,这是一个空模型,然后你在all函数中调用它并请求images属性,但是在你显示的代码中没有任何东西可以从数据库中获取产品模型。
相反,考虑类似下面的函数

Public function show(Product $product)
{
 // then call the image property on the      $product variable which Laravel will get for you 
$product->load(‘Image’);
return response()->json($product);
}

在路由中添加'show_product/{product}',并使用所需产品的ID调用它。

相关问题