当前位置: 首页 > 知识库问答 >
问题:

通过外键的Laravel关系多对多计数相关数据

林泰平
2023-03-14

我有3个模型在我的项目:

用户型号代码:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    protected $guarded = [];

    public function professions()
    {
        return $this->belongsToMany('App\Models\Profession', 'user_professions');
    }
}

职业标准守则

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profession extends Model
{
    protected $guarded = [];

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

迁移:

$table->id();
$table->string("name");
$table->timestamps();

用户职业模型代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserProfession extends Model
{
    //
}

迁移:

$table->id();
$table->foreignId('user_id')
  ->constrained()
  ->onDelete('cascade');
$table->foreignId('profession_id')
  ->constrained()
  ->onDelete('cascade');

当我尝试这个代码时,我通过他的名字搜索用户,并得到职业名称,然后计算该职业的用户。

代码:

$query = $request->get("query");
$users = User::where("name", "like", "%".$query."%");
$userIds = $users->get()->pluck("id")->toArray();

$professions = Profession::whereHas("users", function($q) use($userIds) {
    $q->whereIn('id', $userIds);
})->get()->toArray();

我收到错误消息:

照明\数据库\查询异常:SQLSTATE[23000]:完整性约束违反:1052列'id'在其中子句是含糊不清的(SQL:选择*从存在的职业(选择*从用户内连接user_professionsusers.id=user_professions.user_id其中professions.id=user_professions.profession_id和id in(11, 43, 82)))

我的代码中哪里有错误以及如何修复它?

共有1个答案

贡光明
2023-03-14

有三个表usersuseru professionsprofessions,它们都有id列。

您需要指定需要哪个表的id:

$professions = Profession::whereHas("users", function($q) use($userIds) {
    $q->whereIn('users.id', $userIds); // specify the table name
})->get()->toArray();
 类似资料:
  • 我在拉雷维尔的这种多对多关系中过得很艰难。我有一个多对多的关系,项目和人。我还有第三个表roles(有两列:id、name),其中包含一个人在项目中可以扮演的角色(在本例中为“actor”、“director”等)。透视表person\u project有“person\u id”、“project\u id”和“role\u id”列。我成功地让所有与项目相关的人员使用 但是我怎么能让人在项目中

  • 我在一个laravel控制器中运行以下代码, 但是我似乎从服务器上得到了以下错误, {“error”:{“type”:“ErrorException”,“message”:“preg_replace():参数不匹配,模式为字符串,而替换为数组”,“file”:“/Users/S/Sites/app api/vendor/laravel/framework/src/illumb/Support/he

  • 我有3个标签:用户、教师和帖子。 用户: id-integer name-string 教师: id-integer 教师id-integer 用户id-integer 姓名-string 帖子: id-integer user\u id-integer title-string 用户模型: 教师模式: ??问题是我如何使用这样的东西:

  • 我在Books表和Authors表之间有多对多的关系。透视表(author_book)包含author_id和book_id。

  • 问题内容: 我正在尝试创建一个消息传递系统,其中消息的发送者和接收者可以是通用实体。对于发件人来说,这似乎很好,在该发件人中只有要引用的对象(GenericForeignKey),但我不知道如何为收件人进行处理(GenericManyToManyKey ??)。 下面是一个简化的示例。PersonClient和CompanyClient从Client继承属性,但具有其自己的特定详细信息。最后一行是

  • 问题内容: 我正在尝试与Laravel创建一个友谊系统(我从它开始),但是我被各种关系所困扰。事情是这样的:有一个表Users和一个表Friends,其中包含以下列: 它看起来像“多对多”,所以这是我在User类上设置的: 但是当我尝试一个: 我有这个错误: 我想获取用户好友列表,无论用户发送邀请还是收到邀请都无所谓。因此,用户可以根据user_id或friend_id,然后根据该列检索其他用户的