Laravel 5.5用户模型和朋友关系(belongsToMany)由多列组成

时间:2017-09-20 04:52:07

标签: php mysql laravel laravel-5

问题

我为我的Laravel应用程序创建了一个简单的友谊关系,这一切都运行正常,直到我注意到当我查询用户的友情时,它只搜索Dim n1 As Double Dim n2 As Double Private Sub Worksheet_SelectionChange(ByVal Target As Range) n1 = Cells(2, 8).Value n2 = Cells(2, 3).Value Do While n1 <> 0 n2 = n2 + (n1 * -1) Cells(2, 3).Value = n2 n1 = Cells(2, 8).Value Loop End Sub 字段上的当前用户。

由于友谊本质上是一种双向关系,我试图在laravel模型中找到一种通过多列检索所有友谊关系的方法。

当前实施

UID1

理想实施

    public function friends()
    {
        return $this->belongsToMany( App\Modules\Users\Models\User::class ,'friends', 'uid1');
    }

表结构

    public function friends()
    {
        $a = $this->belongsToMany( App\Modules\Users\Models\User::class ,'users_friends', 'uid1');
        $b = $this->belongsToMany( App\Modules\Users\Models\User::class ,'users_friends', 'uid2');

        return combine($a,$b);

    }

如果当前UserID = 1,则当前实现将仅返回其中一条记录,这是根据以下朋友表中的数据。

     +----------------------+
     | users table          |
     +----------------------+
+----|   id: primary UserID |
|    |   fname: string      |
|    +----------------------+
|    
|    
|    +----------------------+
|    | friends table        |
|    +----------------------+
|    |   id: primary iD     |
|    |                      |
+----|   uid1: user_id      |
|    |                      |
+----|   uid2: user_id      |
     +----------------------+

用户模型

     +-------------------------------+
     |      friends table (data)     |
     +--------|---------|------------+
     |   id   |  uid1   |   uid2     |
     +--------|---------|------------+
     |    1   |   1     |    7       |
     |    2   |   7     |    1       |
     |    3   |   9     |    1       |
     +-------------------------------+      

环境

  • Server = Homestead / linux
  • PHP = 7
  • MySQL的

更新

我有一个我创建的FriendShip助手类,它做了类似的事情,但是在这个函数中我明确地传递了UserID

<?php

namespace App\Modules\Users\Models;

use Illuminate\Database\Eloquent\Model;


class User extends Model
{


    protected $table = 'users';


    protected $fillable = [
        'username', 'email', 'password', .... . 
    ];


    public function friends()
    {
        return $this->belongsToMany( App\Modules\Users\Models\User::class ,'users_friends', 'uid1');

    }

1 个答案:

答案 0 :(得分:0)

您可以通过简单地链接来声明关系时添加其他条件。

"="

但请记住,eloquent并未将括号中的第一个关系条件分组,因此您可能会以某些情况下无法正常工作的SQL结束(如果使用应该没问题)

例如,上面的内容可能会导致SQL看起来像这样

<?php
//...
class User extends Model {
//...
    public function friends() {
        return $this->hasMany(/*...*/)->orWhere('uid2', $this->id);
    }
//...

这是一个正确的SQL语句,但如果没有分组,您将无法获得您期望的结果。

另一种方法是使用accessor和两个单独的关系

SELECT * FROM users_friends WHERE uid1 = ? AND uid1 IS NOT NULL OR uid2 = ?

但是这样你就可以两次单独前往DB。