2016-02-13 4 views
1

Я столкнулся с проблемой: я создал простую пользовательскую систему, чтобы пользователи могли следовать друг за другом. Я использую таблицу с именем follows для хранения отношения. Я создал связь hasMany в своем классе User, и, получая результаты, получаю именно то, что ожидаю, однако, я хотел бы получить дополнительную информацию из таблицы пользователей, такую ​​как имя пользователя, аватар, и т. д. Как мне это сделать?Laravel 5.2 Пользовательская система: hasMany Relation

follows стол

// following_id is the person being followed 

public function up() 
{ 
    Schema::create('follows', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('user_id')->unsigned(); 
     $table->integer('following_id')->unsigned(); 
     $table->timestamps(); 

     $table->unique(['user_id', 'following_id']); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
    }); 
} 

User класс

class User extends Authenticatable 
{ 
    // a user can have many followers 
    public function followers() 
    { 
     return $this->hasMany(Follow::class, 'following_id'); 
    } 


    // a user may be following many people 
    public function following() 
    { 
     return $this->hasMany(Follow::class); 
    } 
} 

Метод, который я звоню в UsersController, чтобы увидеть результаты

// route is /{username}/followers 

public function followers($username) 
{ 
    $user = User::where('username', $username)->first(); 

    // get the user's followers 
    $followers = $user->following; 

    return $followers; 
} 

Текущие результаты

[ 
    { 
     id: 24, 
     user_id: 3, 
     following_id: 1, 
     created_at: "2016-02-13 11:42:59", 
     updated_at: "2016-02-13 11:43:02" 
    } 
] 

Однако, я хотел бы, чтобы они были следующими: где fredflintstone - пользователь с ID 1; например.; пользователь, который следит за пользователем 3

[ 
    { 
     id: 24, 
     user_id: 3, 
     following_id: 1, 
     following_username: 'fredflintstone', 
     created_at: "2016-02-13 11:42:59", 
     updated_at: "2016-02-13 11:43:02" 
    } 
] 

Я также создал Follow модель, которая в настоящее время пуст. Я попытался добавить в него обратную связь belongsTo, но это не сработало. Возможно, я сделал это неправильно?

+0

do this User :: where ('username', $ username) -> with ('follow') -> first(); –

+0

@AmirBar Не мог заставить это работать. – timgavin

+0

почему? вам нужно предоставить больше информации, когда вы делаете dd (User :: where ('username', $ username) -> с ('follow') -> first()), что происходит? –

ответ

0

Я использую Laravel в течение длительного времени, и я предлагаю вам использовать присоединиться вместо этого, если Laravel построен в модели для «с»

Вот код, используя соединение, изменить его в соответствии с вашим использованием

public function followers($username) 
     { 
      $user = User::where('username', $username)->first(); 
//Follower your model name for the follows table 
//if you dont have a model use DB::table('follows') instead 
      $followers=Follower::where('user_id',$user->id) 
       ->join('users as follower','follower.id','=','follows.following_id') 
       ->select('follows.id','follows.following_id','follows. user_id','follower.name as following_username')->get(); 


      return $followers; 
     } 
+0

Это решение дает мне некоторый контроль над тем, что возвращается ... Невозможно ли использовать отношение? – timgavin

+0

вы можете использовать что-то вроде этого User :: where ('username', $ username) -> with ('follow') -> first(); –

0

Обдумал это. Мне нужно было присоединиться к таблице пользователей к запросу.

public function following() 
{ 
    return $this->hasMany(Follow::class, 'user_id') 
     ->join('users', 'users.id', '=', 'follows.following_id') 
     ->select('user_id','username'); 
} 
Смежные вопросы