Ben*_*Ben 7 php laravel laravel-routing laravel-5.2
模型A有一个多态关系模型X,Y,Z.相关领域A是:
poly_id(整数外键)
poly_type(字符串App\X,App\Y或App\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)但它不起作用.
使用 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 是一个有效的路径
我认为我的解决方案如下。位于多态关系的多端的所有表都将具有标识 路线或操作的属性(取决于我如何理解这个想法)。
模型:
<?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 来从模型返回适当的属性?
我的回答是希望有人有更优雅的解决方案。例如,注册一个服务提供商,然后:
只是我不知道该怎么做!
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |