在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