Laravel关系倍数在哪里

时间:2019-07-15 11:35:32

标签: php laravel eloquent laravel-5.8

假设我具有以下数据库结构:

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,遵循相同的关系概念。

注意:在这种情况下,多态不是解决方案

2 个答案:

答案 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();