Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有自定义数据透视表的高级雄辩查询_Php_Laravel_Laravel 4_Eloquent - Fatal编程技术网

Php 具有自定义数据透视表的高级雄辩查询

Php 具有自定义数据透视表的高级雄辩查询,php,laravel,laravel-4,eloquent,Php,Laravel,Laravel 4,Eloquent,这里有一个给你的大师。 我有四张桌子。用户、厨师、地点、类型 用户表 id etc id user_id etc id zip etc id type_name etc id location_id user_id type_id 厨师桌 id etc id user_id etc id zip etc id type_name etc id location_id user_id type_id 位置表 id etc id user_id etc id zip etc

这里有一个给你的大师。 我有四张桌子。用户、厨师、地点、类型

用户表

id
etc
id
user_id
etc
id
zip
etc
id
type_name
etc
id
location_id
user_id
type_id
厨师桌

id
etc
id
user_id
etc
id
zip
etc
id
type_name
etc
id
location_id
user_id
type_id
位置表

id
etc
id
user_id
etc
id
zip
etc
id
type_name
etc
id
location_id
user_id
type_id
类型表

id
etc
id
user_id
etc
id
zip
etc
id
type_name
etc
id
location_id
user_id
type_id
创建的每个厨师帐户都是一个用户。创建的每个用户帐户不一定都是厨师。还有其他类型,但为了简单起见,我省略了

厨师和用户模型

class Chef extends Eloquent {
    public function user() {
        return $this->belongsTo('User');
    }
}
class User extends Eloquent {
    public function chef() {
        return $this->hasOne('Chef');
    }
}
“用户”表与“位置”表具有多对多关系。我还将“type\u id”包含在“location\u user”透视表中

位置\用户数据透视表

id
etc
id
user_id
etc
id
zip
etc
id
type_name
etc
id
location_id
user_id
type_id
位置模型

class Location extends Eloquent {
    public function users() {
        return $this->belongsToMany('User')->withTimestamps()->withPivot(['type_id']);
    }
}
我的目标是返回特定“zip”的所有厨师id,该字段位于“locations”表中。 更多信息-透视表中可用的type_id值之一为“0”。如果成为厨师的用户不想为其厨师帐户创建单独的位置,则这表示默认位置。每个用户都有一个对应的pivot(location\u User)条目,类型为\u id=0。如果用户希望有一个单独的位置作为厨师,则会创建一个单独的“位置”表条目,并通过类型为2的单独透视表条目链接。这样系统就知道使用哪个位置。如果存在特定用户的厨师帐户,但没有附带类型为_id=2的透视帐户,则使用透视帐户(该用户_id且类型为_id=0)链接到的位置

这是我的搜索代码的一部分:

        if ($city_search || $zip_search) {
            $chef_ids = array();
            // TODO: Possibly bad for scaling.  Find a single Eloquent call for this
            $locations = Location::with('users')
                ->where('zip', 'LIKE', "%$city_search%")
                ->where('zip', 'LIKE', "%$zip_search%")
                ->get();
            foreach ($locations as $loc) {
                foreach ($loc->users as $user) {
                    $chef_ids[] = $user->chef->id;
                }
            }
        }

        if (count($chef_ids) == 0) return NULL;
问题是,如果单个用户也是厨师,其厨师位置为默认位置,但还有另一个[type other not Chef]位置,则透视表中该用户将有2条记录,一条为类型_id=0(同时服务于默认位置和厨师位置),另一条为类型_id=?。如果默认位置不是查询的'zip'值,但另一个是,则将返回该厨师的id。 为清楚起见,流程如下所示: 使用zip=?,获取所有位置?。从数据透视表获取所有用户

*其中一个用户也是厨师,但是他的厨师帐户使用默认位置(pivot表中类型为_id=0的记录。没有用户值为_id且类型为_id=2的pivot记录)*

从所有这些用户那里获取厨师和他们的ID。此用户是否有一个pivot帐户,其位置id包含查询的zip值?是(对于其他类型)。此用户是否有厨师帐户?对然后返回他的chef_id,即使他的chef帐户使用另一个zip中的默认位置

有什么建议吗?

试试:

$locations = Location::with('users.chef') [etc..]