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..]