【问题标题】:Advanced Eloquent query with custom pivot table带有自定义数据透视表的高级 Eloquent 查询
【发布时间】:2013-08-04 22:34:23
【问题描述】:

这是给各位大师的。 我有 4 张桌子。用户、厨师、地点、类型。

用户表

id
etc

主厨桌

id
user_id
etc

位置表

id
zip
etc

类型表

id
type_name
etc

创建的每个 Chef 帐户都是一个用户。创建的每个用户帐户都不一定是 Chef。还有其他类型,但为简单起见,我省略了。

厨师和用户模型

class Chef extends Eloquent {
    public function user() {
        return $this->belongsTo('User');
    }
}
class User extends Eloquent {
    public function chef() {
        return $this->hasOne('Chef');
    }
}

“用户”表与“位置”表具有多对多关系。我还在“location_user”数据透视表中包含了“type_id”。

location_user 数据透视表

id
location_id
user_id
type_id

位置模型

class Location extends Eloquent {
    public function users() {
        return $this->belongsToMany('User')->withTimestamps()->withPivot(['type_id']);
    }
}

我的目标是返回特定“zip”的所有厨师 ID,该字段位于“位置”表中。 更多信息 - 数据透视表中可用的 type_id 值之一是“0”。如果成为厨师的用户不想为其厨师帐户创建单独的位置,这表示默认位置。每个用户都有其中一个,即 type_id = 0 的相应数据透视表 (location_user) 条目。如果用户希望将单独的位置作为厨师,则创建单独的“位置”表条目,并通过带有 type_id 的单独数据透视表条目链接= 2. 这样系统就知道要使用哪个位置。如果特定用户的 Chef 帐户存在但没有伴随 type_id = 2 的数据透视帐户,则使用数据透视帐户(具有该 user_id 和 type_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;

问题是,如果单个用户也是厨师,其厨师位置作为默认值,但还有另一个 [除厨师以外的类型] 位置,那么数据透视表中将有该用户的 2 条记录,一条type_id = 0(同时提供默认位置和 Chef 位置),另一个使用 type_id = ?。如果默认位置不是查询的 'zip' 值,但另一个是,则将返回该厨师的 id。 为清楚起见,流程将如下所示: 使用 zip = ? 获取所有位置。从数据透视表中获取所有用户。

*其中一个用户也是厨师但是他的厨师帐户使用默认位置(数据透视表中 type_id = 0 的记录。没有他的 user_id 值和 type_id = 2 的数据透视记录)。*

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

有什么建议吗?

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

    试试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2015-06-24
      • 2018-01-13
      • 2017-07-03
      • 1970-01-01
      • 2015-09-30
      • 2018-12-08
      相关资源
      最近更新 更多