【问题标题】:Using whereHas eloquent relationship query使用 whereHas 雄辩的关系查询
【发布时间】:2018-04-02 18:06:06
【问题描述】:

我有以下表格: 用户

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('username');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->integer('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles');

区域

Schema::create('areas', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('location_id')->unsigned();
            $table->foreign('location_id')->references('id')->on('locations')->onDelete('cascade');
            $table->timestamps();

area_user

Schema::create('area_user', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->integer('area_id')->unsigned();
            $table->foreign('area_id')->references('id')->on('areas');
        });

建筑物

Schema::create('buildings', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('symbol')->nullable();
            $table->integer('area_id')->unsigned();
            $table->foreign('area_id')->references('id')->on('areas')->onDelete('cascade');
            $table->integer('building_type')->unsigned();
            $table->foreign('building_type')->references('id')->on('building_types');
            $table->timestamps();
        });

用户模型:

public function areas()
    {
        return $this->belongsToMany('App\Area');
    } 

区域模型:

public function users(){
        return $this->belongsToMany('App\User');
    }

建筑模型:

public function area(){
       return $this->belongsTo('App\Area','area_id');
    }

如何在用户模型中编写一个查询,返回所有通过用户分配区域分配给用户的建筑物(area_user 表) 我试过这个,但它返回一个错误

Building::whereHas('area', function ($q) {
            $q->whereHas('users', function ($q) {
                $q->where('id', auth()->id());
            });
        })->get();

错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select * from `buildings` where exists (select * from `areas` where `buildings`.`area_id` = `areas`.`id` and exists (select * from `users` inner join `area_user` on `users`.`id` = `area_user`.`user_id` where `areas`.`id` = `area_user`.`area_id` and `id` = 11))) (View: C:\xampp\htdocs\hse\resources\views\observations\form_observation.blade.php) (View: C:\xampp\htdocs\hse\resources\views\observations\form_observation.blade.php)

【问题讨论】:

    标签: php mysql database laravel eloquent


    【解决方案1】:

    您可以通过在 where 子句中指定表来解决歧义:

    改变

    $q->where('id', auth()->id());
    

    $q->where('users.id', auth()->id());
    

    【讨论】:

    • 当我在用户模型 App\User::buildings 中使用此查询时显示错误必须返回一个关系实例。 (查看:C:\xampp\htdocs\hse\resources\views\observations\form_observation.blade.php 在查看文件中 ======= #foreach (Auth::user()->buildings as $b) { {$b->name}} #endforeach
    • @user2873860 你好像遇到了新问题,应该问一个新问题。
    • 好的,我肯定会发布一个新问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2016-07-01
    • 2019-01-22
    • 2022-01-27
    • 2016-02-26
    • 2018-12-09
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多