2016-09-08 1 views
0

J'essaye de ne retourner que des profils spécifiques pour les utilisateurs qui ont des rôles (role_id 5 & 6) qui sont actifs dans les deux tables. Ce serait bien aussi que je puisse aussi commander par nom de famille ASC (table utilisateur).Eloquent :: Un-à-un où actif dans les deux tables, mais rôles spécifiques

user 
+---------+---------+-------------+-----------+ 
| user_id | role_id | first_name | is_active | 
+---------+---------+-------------+-----------+ 
|  1 |  5 | Dan   |   1 | 
|  2 |  6 | Bob   |   0 | 
+---------+---------+-------------+-----------+ 

profile 
+------------+---------+------+-------------+-----------+ 
| profile_id | user_id | bio | avatar | is_active | 
+------------+---------+------+-------------+-----------+ 
|   1 |  1 | text | example.jpg |   1 | 
|   2 |  2 | text | noimage.gif |   1 | 
+------------+---------+------+-------------+-----------+ 

Mon modèle utilisateur

namespace App\Model; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model{ 

protected $table = 'user'; 
protected $primaryKey = 'user_id'; 

protected $fillable = [ 
    'role_id', 
    'first_name', 
    'is_active' 
]; 

public function scopeActive(){ 
    return $this->where('is_active', '=', 1); 
} 

public function role(){ 
    return $this->belongsTo('App\Model\Role'); 
} 

public function profile(){ 
    return $this->hasOne('App\Model\Profile'); 
} 
} 

Mon modèle de profil

namespace App\Model; 

use Illuminate\Database\Eloquent\Model; 

class Profile extends Model{ 

protected $table = 'profile'; 
protected $primaryKey = 'profile_id'; 

protected $fillable = [ 
    'user_id', 
    'avatar', 
    'is_active' 
]; 

public function scopeActive(){ 
    return $this->where('is_active', '=', 1); 
} 

public function user(){ 
    return $this->belongsTo('App\Model\User'); 
} 
} 

Mon UserController

namespace App\Controller\User; 

use App\Model\User; 
use App\Model\Profile; 
use App\Controller\Controller; 

final class UserController extends Controller{ 

public function listExpert($request, $response){ 

    $user = User::active()->whereIn('role_id', array(5, 6))->orderBy('first_name', 'asc')->get(); 
    $profile = $user->profile ?: new Profile; 
    $data['experts'] = $profile->active()->get(); 

    $this->view->render($response, '/Frontend/experts.twig', $data); 
    return $response; 
} 
} 

Je reçois tous mes dossiers très bien. J'obtiens tous les profils mais pas ceux qui n'appartiennent qu'à role_id 5 & 6 dans la table user. De plus, si je mets is_active à 0 dans la table des utilisateurs, ils sont toujours affichés. Mais si je mets is_active dans la table de profil, ils ne le font pas. Je n'ai pas besoin de montrer si la table User ou Profile a ces lignes inactives. Parce que vous pouvez avoir un utilisateur, mais ils peuvent ne pas vouloir un profil actif.

Répondre

0

D'accord, je l'ai eu!

$data['experts'] = User::whereIn('role_id', array(5, 6)) 
     ->where('is_active', '1') 
     ->whereHas('profile', function($q){ 
      $q->where('is_active', '1'); 
     }) 
     ->with('profile') 
     ->orderBy('first_name', 'ASC') 
     ->get(); 

Si vous voulez savoir comment retourner cela dans brindille ....

{% if experts|length > 0 %} 
    <ul> 
    {% for item in experts %} 
     <li>First Name: {{ item.first_name }}, Bio: {{ item.profile.bio }}, Avatar: {{ item.profile.avatar }}</li> 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>No records found.</p> 
{% endif %}