php - wherepivot - Cómo delimitar una relación Eloquent(o realizar una unión tradicional)
where pivot laravel (0)
Estoy intentando construir un conjunto de modelos Eloquent, que representan una base de datos existente de dispositivos de hardware (ninguno de los cuales se puede cambiar). Sé cómo hacer esto en SQL, pero estoy luchando por estructurar una de las relaciones modelo que utiliza una tercera tabla, similar a una tabla de relación / unión, pero para una relación de uno a uno con una clave compuesta.
Hay tres entidades (simplificadas):
- dispositivo
- sesión
- device_user
Un usuario puede estar en muchos dispositivos a la vez y tiene registros de sesión asociados con esos dispositivos. Los usuarios tienen una ID única, pero desde la perspectiva del dispositivo solo tienen un "número de usuario" que es breve (3 bytes) y por lo tanto no pueden representar a toda la gama de usuarios, por lo que se asigna en la tabla device_user. (En realidad es más complejo que esto, pero a los fines de esta pregunta lo he quitado)
tabla de dispositivos:
d_id PK
[data fields...]
tabla device_user:
du_uid User''s actual ID
du_device_id FK to device.d_id
du_number 000-999
[metadata...]
tabla de sesión:
s_device_id device.d_id
s_user_number 000-999 (device_user.du_number)
[data fields...]
El escenario: tengo una sesión, y quiero buscar el device_user.d_uid específico. En SQL, haría algo como:
SELECT session.blah, du_uid
FROM session
INNER JOIN device_user ON du_device_id = s_device_id AND du_number = s_user_number
Así que supongo que eso hace que sea solo una relación en una clave compuesta.
Lo que probé en Eloquent es así:
class SessionLogModel {
public function device(){
return $this->belongsTo(''MyModels//DeviceModel'', ''s_device_id'', ''d_id'');
}
public function user(){
return $this->belongsTo(''MyModels//DeviceUserModel'', ''s_user_number'', ''du_number'')
// A) I tried:
->withDevice($this->s_device_id);
// or B) I tried:
->withDevice($this->device());
}
// example usage
public static function getRecentUser(DateTime $localTime, $deviceId){
$u = null;
// get the preceding session log
$q = SessionLogModel::where(''session_type'', ''='', ''S'')
->where(''session_device_id'', ''='', $deviceId)
->where(''sesison_date'', ''<='', $localTime)
->orderBy(''session_id'', ''DESC'')
->take(1)
->with(''device'')
->with(''user'');
$s = $q->get()->first();
$u = $s->user->du_uid; // use the unique user ID
...
}
}
class DeviceUserModel {
// A)
public function scopeWithDevice($query, $device_id){
return $query->where(''du_device_id'', ''='', $device_id);
}
// OR B) I tried:
public function scopeWithDevice($query, $device){
return $query->where(''du_device_id'', ''='', $device->d_id);
}
}
He intentado varias formas de limitar la coincidencia a ambas columnas con un alcance u otras construcciones "donde", pero siempre parece tener problemas para "enviar" el valor correcto a través de BelongsTo. La identificación del dispositivo aparece como NULL cuando se inspecciona DB :: getQueryLog. Sin embargo, si codigo un valor en el pertenece, puedo verlo "funcionando".
He investigado esto bastante, pero me resulta difícil encontrar una construcción similar ilustrada.
Estoy usando Eloquent de Laravel v4.2 utilizado de forma independiente (no en Laravel).
¿El enfoque anterior basado en el alcance va a funcionar? ¿O debería estar buscando un método diferente?