{"id":578,"date":"2016-09-16T17:20:07","date_gmt":"2016-09-16T20:20:07","guid":{"rendered":"http:\/\/www.henriquereis.com\/blog\/?p=578"},"modified":"2016-09-16T17:20:50","modified_gmt":"2016-09-16T20:20:50","slug":"laravel-morphmany-e-morphone-nao-pega-o-model-pai-como-resolver","status":"publish","type":"post","link":"https:\/\/henriquereis.com\/blog\/laravel-morphmany-e-morphone-nao-pega-o-model-pai-como-resolver\/","title":{"rendered":"Laravel: morphMany e morphOne n\u00e3o pega o model pai, como resolver"},"content":{"rendered":"<p>Permitir especificar a model.<\/p>\n<p>Problema:<\/p>\n<p>quando eu tenho:<\/p>\n<blockquote><p>\nnamespace Domain\\Client;<\/p>\n<p>use Domain\\Address\\Address;<br \/>\nuse Illuminate\\Database\\Eloquent\\Model;<\/p>\n<p>class Client extends Model {<br \/>\n    public function addresses()<br \/>\n    {<br \/>\n        return $this->morphMany(Address::class, &#8216;owner&#8217;);<br \/>\n    }<br \/>\n}<\/p>\n<p>&#8212;-<br \/>\nnamespace Domain\\Customer;<\/p>\n<p>class Customer extends \\Domain\\Client\\Client<br \/>\n{<br \/>\n}\n<\/p><\/blockquote>\n<p>O relacionamento addresses n\u00e3o funciona, porque a class morphMany pega o nome da class &#8220;Domain\\Customer\\Customer&#8221; e \u00e9 necess\u00e1rio pegar neste caso o nome da class pai, que caso &#8220;Domain\\Client\\Client&#8221;,<\/p>\n<p>Solu\u00e7\u00e3o: estenda a class &#8220;Model&#8221; do Laravel e adicione os m\u00e9todos:<\/p>\n<blockquote><p>\n    \/**<br \/>\n     * Define a polymorphic one-to-one relationship.<br \/>\n     *<br \/>\n     * @param  string  $related<br \/>\n     * @param  string  $name<br \/>\n     * @param  string  $type<br \/>\n     * @param  string  $id<br \/>\n     * @param  string  $localKey<br \/>\n     * @param  \\Illuminate\\Database\\Eloquent\\Model  $parent<br \/>\n     * @return \\Illuminate\\Database\\Eloquent\\Relations\\MorphOne<br \/>\n     *\/<br \/>\n    public function morphOne($related, $name, $type = null, $id = null, $localKey = null, Model $parent = null)<br \/>\n    {<br \/>\n        $instance = new $related;<\/p>\n<p>        list($type, $id) = $this->getMorphs($name, $type, $id);<\/p>\n<p>        $table = $instance->getTable();<\/p>\n<p>        $localKey = $localKey ?: $this->getKeyName();<\/p>\n<p>        if (is_null($parent)) {<br \/>\n            $parent = $this;<br \/>\n        }<\/p>\n<p>        return new MorphOne($instance->newQuery(), $parent, $table.&#8217;.&#8217;.$type, $table.&#8217;.&#8217;.$id, $localKey);<br \/>\n    }<\/p>\n<p>    public function attributesToArray()<br \/>\n    {<br \/>\n        $attributes = parent::attributesToArray();<br \/>\n        $dates = $this->getCastDates();<br \/>\n        foreach ($dates as $key) {<br \/>\n            if (!array_key_exists($key, $attributes)) {<br \/>\n                continue;<br \/>\n            }<\/p>\n<p>            $attributes[$key] = Carbon::parse($attributes[$key])->format(&#8216;Y-m-d&#8217;);<br \/>\n        }<\/p>\n<\/blockquote>\n<p>Agora<br \/>\nforma de solucionar com a altera\u00e7\u00e3o proposta seria informar isso na class pai, dessa forma:<\/p>\n<blockquote><p>\nnamespace Domain\\Client;<\/p>\n<p>use Domain\\Address\\Address;<br \/>\nuse Seu-Model-Personalizado-com-os-metodos;<\/p>\n<p>class Client extends Seu-Model-Personalizado-com-os-metodos {<br \/>\n    public function addresses()<br \/>\n    {<br \/>\n        return $this->morphMany(Address::class, &#8216;owner&#8217;, null, null, null, new Self);<br \/>\n    }<br \/>\n}\n<\/p><\/blockquote>\n<p>Foi proposto no framework do Laravel uma PR, caso aceite n\u00e3o ser\u00e1 necess\u00e1rio fazer isso, j\u00e1 ter\u00e1 a solu\u00e7\u00e3o nativa.<br \/>\n<a href=\"https:\/\/github.com\/laravel\/framework\/pull\/15471\">https:\/\/github.com\/laravel\/framework\/pull\/15471<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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, &#8216;owner&#8217;); } } &#8212;- namespace Domain\\Customer; class Customer extends \\Domain\\Client\\Client { } O relacionamento addresses n\u00e3o funciona, porque a class morphMany pega o nome da class &#8220;Domain\\Customer\\Customer&#8221; e \u00e9 necess\u00e1rio &hellip; <a href=\"https:\/\/henriquereis.com\/blog\/laravel-morphmany-e-morphone-nao-pega-o-model-pai-como-resolver\/\" class=\"more-link\">Continue lendo <span class=\"screen-reader-text\">Laravel: morphMany e morphOne n\u00e3o pega o model pai, como resolver<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/posts\/578"}],"collection":[{"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/comments?post=578"}],"version-history":[{"count":2,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/posts\/578\/revisions"}],"predecessor-version":[{"id":580,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/posts\/578\/revisions\/580"}],"wp:attachment":[{"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/media?parent=578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/categories?post=578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/henriquereis.com\/blog\/wp-json\/wp\/v2\/tags?post=578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}