如何最好地链接到Laravel中的多态关系

Ben*_*Ben 7 php laravel laravel-routing laravel-5.2

模型A有一个多态关系模型X,Y,Z.相关领域A是:

poly_id(整数外键)
poly_type(字符串App\X,App\YApp\Z)

给定一个模型实例A,我可以成功地$a->poly用来检索X,Y或Z类型的相关对象.(例如{"id":1,"name":Object X}).

在Blade模板中A,如何生成显示链接,X例如'/ x/1'?URL::route('x.show', $a-poly_>id)然而,我想到的是,我们实际上并没有可用的路径的"x"部分 - 只有poly_id,poly_type和两个对象.

我错过了什么吗?一个解决方案,比如获取poly_type字符串'App\X'并将最后一个段和小写分开以获得'x',但这看起来并不理想,并且可能定义的路径可能是其他的.

顺便说一句,在Rails中,我很确定你能做到link_to($a->poly),它会神奇地返回URL'/ x/3'.不确定Laravel是否可以做到这一点.我试过url($a->poly)但它不起作用.

Mur*_*mlu 5

使用 MorphToMany 和 MorphedByMany

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class A extends Model
{
    public function xs()
    {
        return $this->morphedByMany('App\X', 'poly_type');
    }

    public function ys()
    {
        return $this->morphedByMany('App\Y', 'poly_type');
    }

    public function zs()
    {
        return $this->morphedByMany('App\Z', 'poly_type');
    }

 }
Run Code Online (Sandbox Code Playgroud)

路线:

Route::get('/a/show/{a}/{poly}', 'AController@index');
Run Code Online (Sandbox Code Playgroud)

和控制器:

class AController extends Controller {

    public function index(A $a, $poly)
    {
         dd($a->{$poly}->first()); // a $poly Object
    }
}
Run Code Online (Sandbox Code Playgroud)

所以, /a/show/1/xs 是一个有效的路径


Kur*_*ucu 0

我认为我的解决方案如下。位于多态关系的多端的所有表都将具有标识 路线操作的属性(取决于我如何理解这个想法)。

模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Y extends Model
{
    /**
     * The route name associated with the model.
     *
     * @var string
     */
    protected $routeName= 'path.to.y.show';
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用这样的代码来查找路线,无论最后的模型如何:

route($a->poly->routeName, $a->poly)
Run Code Online (Sandbox Code Playgroud)

或者,对于 hasMany

@foreach($a->polys as $object) 
    <a href="{{route($object->routeName, [$object])}}">But what name?</a>
@endforeach
Run Code Online (Sandbox Code Playgroud)

不过我不知道这是否可以接受。如果您尚未在模型上定义routeName,那么您将遇到错误。我也不确定模型是否应该了解路由!

为了确定要显示的名称,是否应该定义某种 getGenericNameAttribute 来从模型返回适当的属性?


我的回答是希望有人有更优雅的解决方案。例如,注册一个服务提供商,然后:

  • 允许定义模型映射的路径(有点像策略?);和
  • 根据传递的模型/模型类确定正确的路线。

只是我不知道该怎么做!