¿Es posible reemplazar nulo con una matriz vacía cuando no se encuentra ninguna relación?
Ej. El cliente tiene contactos y contratos pero uno de los contratos no tiene web.
$customers = Customer::with('contacts', 'contracts.web') ->orderBy('company')->orderBy('prename')->get();El resultado seria el siguiente...
2 => array:21 [ "id" => 1 "contacts" => array:2 [ 0 => array:12 [ "id" => 1 "customer_id" => 1 ] 1 => array:12 [ "id" => 2 "customer_id" => 1 ] ] "contracts" => array:2 [ 0 => array:9 [ "id" => 1 "customer_id" => 1 "web" => array:7 [ "id" => 1 "contract_id" => 1 ] ] 1 => array:9 [ "id" => 2 "customer_id" => 1 "web" => null // should be replaced with [] ] ] ]Como leí en los documentos ( Restricción de cargas ansiosas), solo es posible manipular la consulta con restricciones de cargas ansiosas.
ACTUALIZAR
clase de contrato
class Contract extends Model { public function web() { return $this->hasOne(Web::class); } }Para más lectores aquí hay una explicación de cómo resolver este tipo de problema.
Laravel devuelve una matriz vacía si no se encuentran registros en una relación hasMany . Si se implementa una relación hasOne , se devolverá nulo.
Entonces, si necesita una matriz también si no se encuentra ningún registro en una relación hasOne, debe hacer lo siguiente.
class Contract extends Model { public function web() { return $this->hasOne(Web::class) ->withDefault(function () { return new Web(); }); } }Implementado de esta manera, no es posible devolver una matriz vacía. Por qué esto no es posible, consulte este problema en Laravel GitHub Issue Tracker.
Hay un código existente que depende del resultado de cualquier relación Eloquent para que sea nulo, una instancia de Modelo o una Colección de instancias de Modelo. Sin embargo, la funcionalidad actual del método withDefault() abre la posibilidad de devolver un objeto que no es uno de esos tres valores esperados.
Si devuelve un nuevo \stdClass; o una matriz vacía, se devuelve una instancia vacía de web. Para obtener una matriz vacía, simplemente instancia un nuevo Objeto de la clase de relación. En mi caso nueva Web();.
Su método de relación debe ser el que maneje esto, ya que es el primer lugar donde puede solucionarlo.
Revisé esto para que devuelva una matriz cuando la variable es nula.
public class Contracts{ public function web(){ $collection = $this->hasMany('App\Web'); return $collection ? $collection : []; } }