Laravel:在每次选择查询后执行集合格式化
Posted
技术标签:
【中文标题】Laravel:在每次选择查询后执行集合格式化【英文标题】:Laravel: Perform collection formatting after each select query 【发布时间】:2016-03-08 04:06:19 【问题描述】:想象以下数据库表:
Clients Users
| Id | name | user_id | | ID | name |
| -- | ----- | ------ | | -- | ------ |
| 1 | NULL | 1 | | 1 | David |
| 2 | Peter | NULL |
并非每个客户都会自动成为用户,但用户可能拥有客户帐户。用户表仅包含注册用户,如果用户是客户(不一定是),则创建客户帐户。
我已经成功建立了这些表之间的关系是 Laravel。雄辩的查询很好,例如:
clients.php
public function userAcc()
return $this->hasOne('User', 'id', 'user_id');
user.php
public function clientAcc()
return $this->hasOne('Clients', 'user_id', 'id');
问题是当我查询这些表时:
Clients::with('userAcc')->get()
鉴于我必须做出很多如果,例如:
@if($client->userAcc)
!! $client->userAcc->name !!
@else
!! $client->name !!
@endif
laravel 中是否有任何解决方法可以让我在每个选择查询上格式化集合?类似 Accessor 的东西,但在整个系列中,所以我可以在视图中做这样的事情:
!! $client->realname !!
它从特定的表中写入客户端名称。
非常感谢您的任何建议
【问题讨论】:
【参考方案1】:这是实现此目的的 Laravel 方法:
class Client extends Model
public $appends = ['realname'];
public function userAcc()
return $this->hasOne('User', 'id', 'user_id');
public function getRealnameAttribute()
return $this->userAcc? $this->userAcc->name : $this->name;
现在可以通过 $client->realname 访问它,并且它会包含在 $client->toJson() 和 $client->toArray() 中
【讨论】:
确认,工作正常,感谢 Jeff 和 @Mina Youssef【参考方案2】:你可以为此制定一个方法:
public function getName()
return $this->userAcc?$this->userAcc->name:$this->name;
在你的刀片中调用函数:
$client->getName()
【讨论】:
像魅力一样工作非常感谢@Mina Youssef,最后一件事关于AJAX调用(返回JSON)你有什么建议如何解决它?我的意思是 Clients::with('userAcc')->get()->toJson(); ... 您可以更进一步,使其成为一个属性,这将允许您以您描述的方式使用它:public function getRealnameAttribute() return $this->userAcc?$this->userAcc->name:$this->name;
然后您可以使用$client->realname
访问它@SirInfant 您可以也可以使用 toJson 函数通过将 appends 属性添加到模型来访问它。 public $appends = ['realname']
然后 ->toJson() 函数将包含实名
这可能行不通,因为自定义访问器不会在 toArray() 中返回。您需要重写 toArray() 方法,并向其添加新的自定义访问器。
请检查这里***.com/questions/17232714/…以上是关于Laravel:在每次选择查询后执行集合格式化的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 格式资源集合响应报错 Property [product_id] does not exist on this collection instance