Laravel-跨数据库关系

时间:2020-10-16 22:46:48

标签: php mysql laravel

我刚刚学习了Laravel,并且正在尝试创建自己的项目。现在我面临挑战。

我有3张桌子。数据库A中有2个表,数据库B中有1个表。

数据库B中的表不可编辑。

表架构

1. conn1.Db_A.app_schedules
 id  | name    | in    | out   
--------------------------------
  1  | 7AM-7PM | 07:00 | 19:00 


2. conn1.Db_A.app_schedule_schedule
 app_schedule_id | schedule_id | name
----------------------------------------------------
     1           |      5      | Long Shift
     1           |     32      | Long Morning Shift


3. conn2.Db_B.schedule
 idschedule | schedulename
----------------------------------------------------
     5      | Long Shift
    32      | Long Morning Shift

AppSchedule.php模型

class AppSchedule extends Model
{
    //
    protected $connection = 'conn1';
    protected $table = 'app_schedules';

    protected $fillable = [
        'created_at',
        'updated_at',
        'name',
        'in',
        'out',
        'remarks',
    ];

    public function schedules()
    {
        return $this->belongsToMany(Schedule::class)->withPivot('schedule_id', 'name');
    }
}

模型Schedule.php

class Schedule extends Model
{
    protected $connection = 'conn1';
    protected $table = 'app_schedule_schedule';

    public function appSchedules()
    {
        return $this->belongsToMany(AppSchedules::class)->withPivot('schedule_id', 'name');
    }
}

模型MainSchedule.php

class MainSchedule extends Model
{
    //
    protected $connection = 'conn2';
    protected $table = 'schedule';
}

控制器AppSchedulesController.php

class AppSchedulesController extends Controller
{
    public function create()
    {
        //
        $schedules = MainSchedule::all();
        return view('admin.schedules.create')->with('schedules', $schedules);
    }

    public function store(Request $request)
    {
        //
        $appschedule = AppSchedule::create($request->all());

        $mainScheIds = $request->input('mainScheIds', []);
        for($mainScheId=0; $mainScheId < count($mainScheIds); $mainScheId++){
            if($mainScheIds[$mainScheId] != '') {
                $appschedule->schedules()->attach($mainScheIds[$mainScheId], ['name' => MainSchedule::select('schedulename')->where('idschedule', $mainScheIds[$mainScheId])->value('schedulename')]);
            }
        }

        $appSchedules = AppSchedule::all();
        
        return view('admin.schedules.index')->with('appSchedules', $appSchedules);
    }
}

现在我的挑战是当我想在索引函数中检索列表时。 我想获得这样的列表:

 ID  | NAME    | IN    | OUT   ! MAIN SCHEDULE
-----------------------------------------------------------
  1  | 7AM-7PM | 07:00 | 19:00 | > 5 - Long Shift
     |         |       |       | > 32 - Long Morning Shift

但是当我编写此索引函数

public function index()
{
   $appSchedules = AppSchedule::with('schedules')->get();

   return view('admin.schedules.index')->with('appSchedules', $appSchedules);
}

我遇到错误

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'app_schedule_schedule' (SQL: select `app_schedule_schedule`.*, `app_schedule_schedule`.`app_schedule_id` as `pivot_app_schedule_id`, `app_schedule_schedule`.`schedule_id` as `pivot_schedule_id`, `app_schedule_schedule`.`name` as `pivot_name` from `app_schedule_schedule` inner join `app_schedule_schedule` on `app_schedule_schedule`.`id` = `app_schedule_schedule`.`schedule_id` where `app_schedule_schedule`.`app_schedule_id` in (1))

我知道我必须为每个表提供唯一的别名。但是我不知道该怎么做,我想得到这样的结果。

我的关系不对吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这肯定会起作用

public function index()
{
   $appSchedules = AppSchedule::with(['schedules' => function ($query) {
                       $query->on('conn2');
                   }])->get();

   return view('admin.schedules.index')->with('appSchedules', $appSchedules);
}