php - 有条件地将属性附加到 laravel 中的模型
问题描述
每当调用模型范围时,是否可以将属性附加到我的模型?
例如,在我的控制器中,我想调用一个范围来附加这些动态属性,例如:
$Media_query = OutDoorMedia::query();
$Media_query->orderby('created_at', 'desc');
$Media_query->PreviouslyOrdered();
$Media = $Media_query->get();
在我的模型中,我想做类似的事情:
class OutDoorMedia extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'id',
'user_id',
'address',
'location',
'media_type',
];
}
class scopePreviouslyOrdered extends OutDoorMedia
{
public $appends = ['previously_ordered'];
public function getPreviouslyOrderedAttribute()
{
if ($this->hasMany('App\Models\OutDoorMediaOrders', 'odm_id', 'id')->Where(function ($query) {
$query->where('status', MEDIA_ORDER_CHECKOUT_STATUS)
->orWhere('status', STATUS_TO_PAY);
})->exists()) {
return true;
} else {
return false;
}
}
}
但它不起作用,我知道这是错误的,如何实现这一目标?
解决方案
我在@apokryfos 的帮助下解决了这个问题,但做了一些调整。希望这减少浪费别人的时间。
我没有在模型上附加属性,而是通过雄辩的魔术方法将所述属性附加到我的模型中:
$Media_query = OutDoorMedia::query();
$Media_query->orderby('created_at', 'desc');
$Media = $Media_query->get()->each(function ($items) {
$items->append('previously_ordered');//add this attribute to all records which has the condition
});
在模型中,正如 apokryfos 所说,我已经提出了这两种方法:
public function PreviousOrders() {
return $this->hasMany('App\Models\OutDoorMediaOrders', 'odm_id', 'id');
}
public function getPreviouslyOrderedAttribute() {
return $this->PreviousOrders()->exists();
}
但我不需要这个方法,我不得不从模型中删除它,因为如果它存在于模型中,它将自动附加到模型中:
public $appends = [ 'previously_ordered' ];
推荐阅读
- symfony - 使用 FOSUserBundle + EasyAdminBundle 和 Symfony 3.4 时用户密码未加密
- json - 在同一个数组上获取所有结果
- ios - 在 Swift 4 中完成 URLSession 数据任务之前,确保方法范围没有完成
- php - 将匿名函数传递给多个函数
- javascript - 如何在javascript中比较两个字段值
- java - 创建 JSON 数据并快速解析
- .htaccess - htaccess 删除域的开头
- c# - ASP.Net - 托管 Web API 源代码而不发布
- android - 无法在不同的 PC 中使用 Firebase 登录 - 错误的 OAuth2 相关配置
- java - 在 Mac 操作系统上构建 OpenJDK 9