在laravel中动态使用模型在视图中发送关系值
我正在制作一个书签类型的网站,希望在分类页面上显示与各自分类相关的链接。一个链接只能有一个类别 我已经创建了模型和视图,但在动态获取数据的控制器代码方面存在问题 链接表在laravel中动态使用模型在视图中发送关系值,laravel,laravel-5,model-view-controller,eloquent,Laravel,Laravel 5,Model View Controller,Eloquent,我正在制作一个书签类型的网站,希望在分类页面上显示与各自分类相关的链接。一个链接只能有一个类别 我已经创建了模型和视图,但在动态获取数据的控制器代码方面存在问题 链接表 { Schema::create('links', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('user_id');
{
Schema::create('links', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->text('link');
$table->text('title');
$table->text('description');
$table->integer('category_id');
$table->integer('votes');
$table->dateTime('submitted_at');
$table->rememberToken();
});
类别表
{
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('slug');
$table->string('status');
$table->timestamps();
});
}
类别模型
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $fillable = [
'name', 'slug', 'status',
];
public function links()
{
return $this->hasMany('App\Links');
}
}
链接模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Links extends Model
{
//
protected $fillable = [
'user_id', 'link', 'title', 'description', 'submitted_at', 'category_id','votes',
];
public $timestamps = false;
public function category()
{
return $this->belongsTo('App\Categories');
}
}
类别控制器
public function index($slug)
{
$getcategoryid = DB::table('categories')->where('slug', '=', $slug)->get();
$catid = $getcategoryid[0]->id;
$catlinks=new \App\Category;
$catlinks=$catlinks::find(1)->Links;
return $catlinks;
问题是我希望find(1)
根据页面动态变化。比如我可以使用$catid,比如find($catid)
什么的
如果is有链接,则如何将数据获取到类别页面?如果没有链接,则如何显示消息?未找到链接。就像使用count()
记住:
除了\App\Category
或\App\Links
之外,您还可以将其包含在控制器顶部,如下所示使用App\Category代码>和使用App\Links代码>
而不是
$getcategoryid = DB::table('categories')->where('slug', '=', $slug)->get();
$catid = $getcategoryid[0]->id;
使用
而不是:
$catlinks=new \App\Category;
$catlinks=$catlinks::find(1)->Links;
return $catlinks;
使用
此代码返回属于该类别的所有链接
如果要将此数据传递给视图
使用
在视图中,您可以检查catid是否有链接
@if($catid->links->count() > 0)
has link
@else
no link
@endif
要获取属于$slug
类别的链接,您可以执行以下操作:
$links = Link::whereHas('category', function($query) use ($slug) {
$query->where('slug', $slug);
})->get();
您也可以通过连接来完成,但这更简单、更清晰
另外,当您拥有模型时,您不需要使用DB::table(…)
,也不需要手动创建模型实例。当您执行Link::whereHas
时,实例将在后台创建。首先,您的代码有点杂乱无章,因此,例如在Laravel中,建议保持所有类名的单数,但您使用的是链接而不是链接。第二,您的数据库结构可能会更好,例如,当您使用关系时,列类型应该与链接表的id相匹配,因此,如果id是bigIncrements
,则链接类别id字段应该是unsignedBigInteger
,也使用外键
试图帮助你
public function index($slug)
{
$category = \App\Category::where('slug', '=', $slug)->first();
$catlinks = $category->links;
return view('name.of.view', ['links' => $catlinks]);
}
如果您学习了路由模型绑定,也可以这样做
public function index(\App\Category $category)
{
$catlinks = $category->links;
return view('name.of.view', ['links' => $catlinks]);
}
在您看来,您可以像这样使用@forelse blade指令
@forelse($links as $link)
Do something with the link
@empty
Message to display if empty
@endforelse
@forelse($category->links as $link)
Do something with the link
@empty
Message to display if empty
@endforelse
但我真正推荐的是学习拉威尔,这些文档非常好。然后,您可以在控制器中执行此操作:-
public function index(\App\Category $category)
{
return view('name.of.view', ['category' => $category]);
}
在您看来,您可以像这样使用@forelse blade指令
@forelse($links as $link)
Do something with the link
@empty
Message to display if empty
@endforelse
@forelse($category->links as $link)
Do something with the link
@empty
Message to display if empty
@endforelse
不幸的是,没有比花时间阅读和使用文档更好的知识和理解框架的方法了似乎您正试图加载单个类别的链接,您可以这样做:
//不要忘记在名称空间声明之后添加此行
使用App\Category;
公共职能指数($slug)
{
返回类别::whereSlug($slug)->firstOrFail()->链接;
}
但更好的方法是为您的类别模型设置路由模型绑定
为此,请在类别类中使用以下方法:
/**
*获取模型的路由密钥。
*
*@返回字符串
*/
公共函数getRouteKeyName()
{
返回“slug”;
}
重要提示:在路由文件中,确保将路由的{slug}
参数替换为{category}
,否则路由模型绑定将无法工作
然后在控制器类中,索引函数将变为:
公共功能索引(类别$Category)
{
返回$category->links;
}
您可以在中阅读有关路由模型绑定的更多信息
最新答案
如果要在类别不存在时自定义响应,可以按照下面的代码执行(在本例中不使用路由模型绑定)
//不要忘记在名称空间声明之后添加此行
使用App\Category;
公共职能指数($slug)
{
$category=category::whereSlug($slug)->first();
如果(!$类别){
返回响应()->json([]);
}
return response()->json($category->links);
}
这一个给出了错误返回$catlinks=$catid->links
“试图获取非对象的属性'links'”@NitinGandhi因为first()->id
,我删除了->id
,再次检查它以解决@mdexp这工作正常,但如果所选类别中没有链接,我如何回显“未找到链接”?空数组?[ ]
@forelse($category->links as $link)
Do something with the link
@empty
Message to display if empty
@endforelse