假设我具有以下数据库结构:
Table A:
-id
-user_id
Table B:
-id
-user_id
Table C:
-id
-user_id
Users:
-id
这是我的用户模型
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
protected $table = 'users';
protected $fillable = ['name','email','username','password'];
/**
* Relationships
*/
public function tableA()
{
return $this->hasOne(\App\Models\TableA::class);
}
public function tableB()
{
return $this->hasOne(\App\Models\TableB::class);
}
public function tableC()
{
return $this->hasOne(\App\Models\TableC::class);
}
public function tableD()
{
return $this->hasOne(\App\Models\TableD::class);
}
}
这是我想要实现的:
public function tables()
{
// return all records from all 3 tables (Table A, Table B, Table C)
}
我可以在表上获取某些信息的方法是在User模型中定义一个关系,说它具有TableA,TableB等的一条记录。但是,我正在寻找一种方法来查找这些表中的哪一个表(a,b,c,d)中有一个Fk的User,遵循相同的关系概念。
注意:在这种情况下,多态不是解决方案
答案 0 :(得分:1)
使用雄辩的本地范围来实现您要执行的操作:
class User
{
public function scopeAllTables($query)
{
return $query->join('table_a', 'table_a.user_id', '=', 'users.id')
->join('table_b', 'table_b.user_id', '=', 'users.id')
->join('table_c', 'table_c.user_id', '=', 'users.id')
->select('users.*')
->addSelect('table_a.id AS table_a_id')
->addSelect('table_b.id AS table_b_id')
->addSelect('table_c.id AS table_c_id');
}
}
在控制器中,您可以这样称呼:
$allTables = User::allTables()->get();
答案 1 :(得分:1)
如果您希望用户记录的所有其他表(即TableA,TableA等)中都有数据,则可以使用以下查询作为已定义的关系:
basename
如果要访问相关表的数据,可以在下面的查询中使用:
$users = User::whereHas('tableA')
->whereHas('tableB')
->whereHas('tableC')
->get();