我有四种型号:
用户
顾客
商场
机会
这些关系的定义如下:
用户有多个客户端
客户有许多商店
商店有很多机会
用户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/

10-11 23:48