with whereraw transaction query php mysql laravel-5 eloquent query-builder

php - transaction - whereraw laravel



Diferente conexión db para modelos que usan la relación hasManyThrough en laravel 5.1 (1)

Estoy tratando de usar la relación hasManyThrough en laravel 5.1 pero la consulta sql no usa el prefijo apropiado definido en cada conexión para cada modelo utilizado. Tengo 3 modelos, 2 de los cuales usan la misma conexión y uno de ellos usa uno diferente. La única diferencia entre las conexiones es el prefijo de que la base de datos es la misma.

  • El modelo A tiene una conexión A que usa el prefijo A_
  • El modelo B tiene una conexión B que usa el prefijo B_
  • El modelo C tiene una conexión B que usa el prefijo B_

La relación:

Dentro del modelo B:

public function relationshipWithA() { return $this->hasManyThrough(A::class, C::class, ''Cid'', ''Aid''); }

La lógica de consulta final es correcta, pero en lugar de usar el prefijo B_ para las tablas unidas usa el prefijo A_ para todas las tablas en la consulta.

¿Es esto un error / limitación de laravel? ¿Hay alguna solución a esto o tendré que hacer una unión manual para lograr lo que quiero?


Otros tipos de relaciones funcionan con múltiples conexiones de bases de datos:

public function foos() { return $this->belongsToMany(Foo::class, ''other_db.foos''); }

Pero hasManyThrough no tiene el parámetro $table en su firma, por lo que la misma solución no es aplicable.

Sin embargo,

Puede hacer una solución imperfecta como esta:

public function bars() { return $this->belongsToMany(Bar::class, ''other_db.bars''); } public function foos() { $barIds = $this->bars->pluck(''id''); return Foo::whereIn(''bar_id'', $barIds); }

No ofrece la misma funcionalidad (ya que es un tipo de devolución diferente), pero cumple el propósito para cosas más simples.

Si lo desea, también puede replicar algo más de la sintaxis haciendo algo como esto:

protected $appends = [ ''foos'', ]; /** * @return Foo[] */ public function getFoosAttribute() { return $this->foos()->get(); }

De esta forma, puedes usarlo en tu código como lo harías la mayoría de las veces con una relación regular (lo que significa que puedes usar $this->foos lugar de $this->foos()->get() )