访问器和构造函数的问题
我在model里,定义了一个属性,protected $user_id = ‘’”;
然后控制器调用这个model的时候传入了一个user_id,然后我在__construct里面获取传入的user_id,将他赋值给$user_id。
然后我又在model里定义了一个访问器,但是在访问器里无法获取$user_id
应该是访问器先被初始化,如何解决这个问题呢
下面是model代码
下面是控制器代码
示例代码
<?php
//MODEL文件
class Good extends Model
{
protected $table = 'goods';
public $timestamps = false;
public $user_id = 0;
protected $appends = ['viprice',];
public function construct($user_id) {
parent::construct();
return $this->user_id = $user_id;
}
public function getVipriceAttribute($val){
//先用$user_id去获取客户信息,获取客户的等级
$userInfo = (new User())->getUserInfo($this->user_id);
//然后获取根据用户的等级返回不同的商品价格
switch ($userInfo->level){
case 1:
return $this->vipPrice_1;//vipPrice_1是数据库中goods表中的字段
case 2:
return $this->vipPrice_2;//vipPrice_2是数据库中goods表中的字段
default:
return 9999;//如果没有会员ID直接返回上商品9999的价格
}
}
//这里是获取商品信息
public function goodInfo($gid)
{
//通过商品ID返回商品的信息
return $this->where('id',$gid)->first();
}
}
//控制器文件
class HomeController extends Controller
{
public function item()
{
$gid = $_GET['gid']; //获取商品ID
$user_id = 1; //模拟会员ID,不能用session获取,因为是api接口,没有session
$good = (new Good($user_id))->goodInfo($gid);
//输出当前用户的商品价格
dd($good->viprice);
}
}
Model 在实例化时会先初始化属性,然后才会调用构造函数。因此,当你在构造函数中赋值给 $user_id 时,访问器已经被初始化了,并且无法获取到最新的 $user_id 值。
通过使用 setAttribute 方法来设置属性值,可以确保属性值在访问器中是最新的。 另外,你也可以使用 Laravel 提供的 setRawAttributes 方法来设置属性值,这个方法可以直接设置属性值,而不需要使用 setAttribute 方法。
虽然我不知道你的需求,但总感觉哪里有问题,你是怎么在模型里写__construct的?
如果是这样的话,我猜是每次查询的时候new了一个新的模型
定义属性没什么用,访问器是从 $attributes 属性里拿的,得往 $attributes 添加,一般直接赋值就行 $model->user_id = $user_id,这么赋值得把自定义的 $user_id 属性删除才行。⌈调用这个 model 的时候传入了一个 user_id⌋,怎么传的?上代码
模型
控制器调用
虚拟属性append应该能满足你的需求吧。
首先 PHP 的构造方法是 __construct 不是 construct。
其次,模型不是楼主这样用的哦。商品查出来如果想根据会员等级返回对应的价格字段可以在 APIResource 里面做逻辑。文档链接:API 资源《Laravel 11 中文文档》
看了下回答,都是牛头不对马嘴。我必须要回答下。 这不就是类与对象吗? 如果用同上的实例,肯定可以获取use_id 每次都是一个新的实例,按照你的写法 无解!!!!