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函数时,出现了错误。
2条答案
按热度按时间ffscu2ro1#
首先,您拥有的是belongsTo关系,因为产品模型有一个ImageId列。https://laravel.com/docs/10.x/eloquent-relationships#one-to-one
你的控制器方法“all”的目的是什么?你想展示你所有的产品与他们的形象?如果是这样,你应该这样做:
https://laravel.com/docs/10.x/eloquent-relationships#eager-loading
你可以在水合模型上调用关系。类似于:
请注意Portuct::first()->images和Product::first()->images()之间的区别。
就一个小提示。如果它是一对一关系,那么你的关系方法应该命名为image()而不是images()。
pgpifvop2#
总的来说,Laravel在你利用它的优势时工作得最好。例如,在上面的代码中,你有$imageId而不是$image_id,然后你被迫在Product模型上的关系中包含要搜索的id,而不是使用Laravel所期望的,即在product表中的$image_id。然后在模型中使用
请注意,函数名称与模型名称相同。并且由于您已经在product表中使用了$image_id,因此不需要进一步的操作。
还要考虑调用产品控制器ProductController而不是ProductService
回答你的问题:在产品控制器的构造函数中,你初始化一个新的产品模型,没有任何对数据库的引用,这是一个空模型,然后你在all函数中调用它并请求images属性,但是在你显示的代码中没有任何东西可以从数据库中获取产品模型。
相反,考虑类似下面的函数
在路由中添加'show_product/{product}',并使用所需产品的ID调用它。