Curta e compartilhe
  • Laravel: morphMany and morphOne not handle the model pci, how to solve

    16
    setembro/16

    Problem:
    When I have:


    namespace Domain\Client;

    use Domain\Address\Address;
    use Illuminate\Database\Eloquent\Model;

    class Client extends Model {
    public function addresses()
    {
    return $this->morphMany(Address::class, 'owner');
    }
    }

    ----
    namespace Domain\Customer;

    class Customer extends \Domain\Client\Client
    {
    }



    The "addresses" relationship doesn't work because the class morphMany is getting (by default) the class name "Domain\Customer\Customer" and in reality, it must get the "father class" which is "Domain\Client\Client".


    I propose to solve this problem by adding a parameter to inform the "father class" in the following way, extends class "Model of Laravel and add its methods":



    /**
    * Define a polymorphic one-to-one relationship.
    *
    * @param string $related
    * @param string $name
    * @param string $type
    * @param string $id
    * @param string $localKey
    * @param \Illuminate\Database\Eloquent\Model $parent
    * @return \Illuminate\Database\Eloquent\Relations\MorphOne
    */
    public function morphOne($related, $name, $type = null, $id = null, $localKey = null, Model $parent = null)
    {
    $instance = new $related;

    list($type, $id) = $this->getMorphs($name, $type, $id);

    $table = $instance->getTable();

    $localKey = $localKey ?: $this->getKeyName();

    if (is_null($parent)) {
    $parent = $this;
    }

    return new MorphOne($instance->newQuery(), $parent, $table.'.'.$type, $table.'.'.$id, $localKey);
    }

    public function attributesToArray()
    {
    $attributes = parent::attributesToArray();
    $dates = $this->getCastDates();
    foreach ($dates as $key) {
    if (!array_key_exists($key, $attributes)) {
    continue;
    }

    $attributes[$key] = Carbon::parse($attributes[$key])->format('Y-m-d');
    }



    Now
    way to solve with the proposed amendment would inform it in class father, like this:


    namespace Domain\Client;

    use Domain\Address\Address;
    use You-Model-With-Methods;

    class Client extends You-Model-With-Methods {
    public function addresses()
    {
    return $this->morphMany(Address::class, 'owner', null, null, null, new Self);
    }
    }



    It was proposed in the framework Laravel one PR, if accepted will not need to do this, you already have a native solution.
    https://github.com/laravel/framework/pull/15471

    Fazer comentário

  • Laravel: morphMany e morphOne não pega o model pai, como resolver

    16
    setembro/16

    Permitir especificar a model.

    Problema:

    quando eu tenho:


    namespace Domain\Client;

    use Domain\Address\Address;
    use Illuminate\Database\Eloquent\Model;

    class Client extends Model {
    public function addresses()
    {
    return $this->morphMany(Address::class, 'owner');
    }
    }

    ----
    namespace Domain\Customer;

    class Customer extends \Domain\Client\Client
    {
    }




    O relacionamento addresses não funciona, porque a class morphMany pega o nome da class "Domain\Customer\Customer" e é necessário pegar neste caso o nome da class pai, que caso "Domain\Client\Client",

    Solução: estenda a class "Model" do Laravel e adicione os métodos:



    /**
    * Define a polymorphic one-to-one relationship.
    *
    * @param string $related
    * @param string $name
    * @param string $type
    * @param string $id
    * @param string $localKey
    * @param \Illuminate\Database\Eloquent\Model $parent
    * @return \Illuminate\Database\Eloquent\Relations\MorphOne
    */
    public function morphOne($related, $name, $type = null, $id = null, $localKey = null, Model $parent = null)
    {
    $instance = new $related;

    list($type, $id) = $this->getMorphs($name, $type, $id);

    $table = $instance->getTable();

    $localKey = $localKey ?: $this->getKeyName();

    if (is_null($parent)) {
    $parent = $this;
    }

    return new MorphOne($instance->newQuery(), $parent, $table.'.'.$type, $table.'.'.$id, $localKey);
    }

    public function attributesToArray()
    {
    $attributes = parent::attributesToArray();
    $dates = $this->getCastDates();
    foreach ($dates as $key) {
    if (!array_key_exists($key, $attributes)) {
    continue;
    }

    $attributes[$key] = Carbon::parse($attributes[$key])->format('Y-m-d');
    }



    Agora
    forma de solucionar com a alteração proposta seria informar isso na class pai, dessa forma:




    namespace Domain\Client;

    use Domain\Address\Address;
    use Seu-Model-Personalizado-com-os-metodos;

    class Client extends Seu-Model-Personalizado-com-os-metodos {
    public function addresses()
    {
    return $this->morphMany(Address::class, 'owner', null, null, null, new Self);
    }
    }



    Foi proposto no framework do Laravel uma PR, caso aceite não será necessário fazer isso, já terá a solução nativa.
    https://github.com/laravel/framework/pull/15471

    Fazer comentário

  • Laravel 5.3 do começo ao fim: Login com Angular (primeira tela)

    12
    setembro/16

    Você estava esperando para ver uma tela diferente do terminal? Pois então eis nossa primeira tela de login usando o Angular para autenticar.



    Fazer comentário

  • Laravel 5.3 do começo ao fim: Update, Atualizando o cadastro

    12
    setembro/16

    Continuando a série hoje vamos fazer atualização do cadastro.



    Fazer comentário

  • Laravel 5.3 do começo ao fim: FormRequest

    11
    setembro/16

    Hoje vamos aprender sobre o formrequest, o que ele é, para que ele serve? Ele serve para validar informações recebidas do usuário. Vamos ao vídeo saber como usar:




    Pacote utilizado para validar o CPF: github.com/resultsystems/validation

    Fazer comentário

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 >>