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

Laravel雄辩-通过用户模型上的方法订购用户关系

慕金林
2023-03-14

我正在使用Laravel Spark开发一个APIendpoint。

此endpoint返回给定团队及其用户。

// in App\Team

public function users()
{
   return $this->belongsToMany(
       'App\User', 'team_users', 'team_id', 'user_id'
   )->withPivot('role');
}

但是,我希望通过用户模型上的方法对这些用户进行排序。

在我的应用程序\用户模型上,我有一个方法:

public function currentQueueLength()
{
    returns an integer based upon the users current appointments,
}

是否有任何方法可以返回用户关系,但根据该方法的结果对用户进行排序?

共有2个答案

王宏深
2023-03-14

您可以通过如下方式对用户进行排序来实现这一点:

Team::with('users')
     ->all();

$team->users->sort(
    function ($user1, $user2) {
        return $user1->currentQueueLength() - $user2->currentQueueLength();
    }
);

有关排序的更多信息:若要按升序排序,请在第一项小于第二项时返回-1。因此,您可以使用:

return $user1->currentQueueLength() < $user2->currentQueueLength() ? -1 : 1;

若要按降序排序,当第一项小于第二项时,返回1。

return $user1->currentQueueLength() < $user2->currentQueueLength() ? 1 : -1;

如果它是用户模型中的一个字段,您可以这样做:

$teams = Team::with(['users' => function ($q) {
  $q->orderBy('Field', 'asc'); // or desc
}])->all();

就财产而言:

// asc
$team->users->sortBy('userProperty');
// desc
$team->users->sortByDesc('userProperty');

希望有帮助:)

王叶五
2023-03-14

如果将current\u queue\u length作为属性添加到User模型中,则可以按此属性排序。

您可以通过将属性添加到$appends数组并创建访问器来添加该属性:

class User extends Model {

    protected $appends = ['currentQueueLength'];

    public function getCurrentQueueLengthAttribute()
    {
        return $this->currentQueueLength();  
    }
}

这个问题值得一提:在加载时向Laravel/Elount模型添加自定义属性?

然后在团队中可以添加如下方法:

class Team extends Model {

    public function users()
    {
       return $this->belongsToMany(
           'App\User', 'team_users', 'team_id', 'user_id'
       )->withPivot('role');
    }

    public function usersByCurrentQueueLength()
    {
        return $this->users->orderBy('current_queue_length');
    }

}

正如我在评论中提到的,这种方法的问题是,它听起来像currentQueueLength()是一个代价高昂的操作(根据您的评论),因此理想情况下,您可以有条件地执行此操作,但我不确定如何执行此操作!您可能需要重新考虑实现currentQueueLength()的方法,这可能会为您构造此查询的方式提供更多选项。

 类似资料:
  • 我被一个简单的任务困住了。我只需要这通电话的结果 其中,是一个模型。我试过这个 但它不起作用。从表中获取所有数据并对其进行排序的更好方法是什么?

  • 我在使用laravel雄辩的ORM时遇到了一个问题。 基本上,我正在获取与用户相关的帖子,以及他的评论,但是,我正在尝试集成某种分页(我一次只想取5个帖子)。 而使用跳过方法,我总是得到以下laravel错误: 方法skip不存在。 这是我实际使用的代码片段。 有人能给我任何帮助吗? 帐户模型检索与用户相关的帖子模型(关系),但是,我想一次只收到5个帖子,用于基于ajax的请求。

  • 亲爱的人们。 最近,我开始更多地使用Laravel模型和雄辩的关系,而不是编写原始查询。 问题:我无法访问表“roles”的任何字段变量。$user->roles->role_name或role_description。

  • 我正在尝试使用Laravel雄辩的模型查询多个表,这些模型具有一对一、一对多和多对多的关系。 我有一个表,一个表,一个表和一个透视表。 每个表单有一个品牌和一个用户: 品牌没有任何外键: 用户没有任何外键: 有一个数据透视表可以创建多对多的关系,用于创建拥有许多用户(如品牌成员)的品牌组: 我试图通过直接所有权()或品牌成员身份获取属于用户的所有表单,通过多对多透视表获取用户所属的所有品牌的所有表

  • 使用Mac、Php版本7.1.19、最新版本的Laravel和SQLite数据库。该网站有3个模型。用户、评论和帖子。我想将评论连接到用户。这样人们就可以在仪表板上看到自己的评论。数据库应正确设置,注释表具有['id'、'user\u id'、'body'、'created\u at'、'updated\u at']。tinker错误告诉我它需要一个返回,但我为这两个函数都添加了一个返回。 你能详

  • 我找了很多,但没有找到任何答案,所以我希望你能帮助我! 我有三个表:post、users和post\U users。Post_users包含两列:user_id和Post_id。 我需要得到一个有口才的用户的所有帖子。有什么想法吗? 非常感谢你! (如果这个问题已经存在,我很抱歉,但我还没有找到它)