我有四种型号:
用户
顾客
商场
机会
这些关系的定义如下:
用户有多个客户端
客户有许多商店
商店有很多机会
用户hasManyThrough商店,客户机(这个工作)
问题是,我正试图通过内置的Laravel关系访问User->Opportunity关系,但似乎在没有自定义查询或Opportunity表上的附加User_id列允许直接访问(即使可以从Store->Client关系推断出用户->Opportunity关系)的情况下,我也做不到这一点。如果可以避免的话,我也不喜欢嵌套循环。
我的问题是:
在这种情况下,有没有办法更深入地直接访问用户的机会?实际型号代码和所有相关关系如下:
用户
class User extends Eloquent{
public function clients(){
return $this->hasMany('Client');
}
public function stores(){
return $this->hasManyThrough('Store', 'Client');
}
public function proposals(){
return $this->hasMany('Proposal');
}
public function opportunities(){ //This does the job, but I feel like it could be better
return Opportunity::join('stores', 'stores.id', '=', 'opportunities.store_id')->
join('clients', 'clients.id', '=', 'stores.client_id')->
join('users', 'users.id', '=', 'clients.user_id')->
select('opportunities.*')->
where('users.id', $this->id);
}
public function getOpportunitiesAttribute(){ //This just helps mimic the hasManyThrough shorthand
return $this->opportunities()->get();
}
}
顾客
class Client extends Eloquent{
public function stores(){
return $this->hasMany('Store');
}
public function user(){
return $this->belongsTo('User');
}
public function opportunities(){
return $this->hasManyThrough('Opportunity', 'Store');
}
}
商场
class Store extends Eloquent {
public function client(){
return $this->belongsTo('Client');
}
public function opportunities(){
return $this->hasMany('Opportunity');
}
}
机会
class Opportunity extends Eloquent {
public function store(){
return $this->belongsTo('Store');
}
}
最佳答案
我认为拉勒维尔没有这种方法。必须创建自定义查询。此自定义查询可能非常昂贵,因为将执行多个查询。因此,在我看来,最佳的解决方案是将用户和机会与外键联系起来。
但是,如果您不想用外键链接用户和Opportunity,则可以创建自定义查询来处理此问题。只需在Opportunity和客户模型之间添加一个“hasManyThrough”关系,
<?php
class Client extends Eloquent{
public function store(){
return $this->hasMany('Store');
}
public function user(){
return $this->belongsTo('User');
}
public function opportunity(){
return $this->hasManyThrough('Opportunity', 'Store');
}
}
然后在用户模型中创建一个静态函数。
<?php
class User extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
public function client(){
return $this->hasMany('Client');
}
public function store(){
return $this->hasManyThrough('Store', 'Client');
}
public static function getOpportunityOfUser($userId)
{
$clients = User::find($userId)->client;
foreach ($clients as $client) {
$opportunities[] = Client::find($client->id)->opportunity;
}
return $opportunities;
}
}
现在您可以一次性访问与用户相关的Opportunity,
Route::get('/', function()
{
return $usersOpportunities = User::getOpportunityOfUser(1);
});
这将返回与id为“1”的用户相关的所有客户端的所有商机。
关于php - 遥远的许多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25938081/