如何将数据库中两个表的数据路由,获取和显示到laravel 5.2

时间:2016-02-22 18:18:08

标签: php mysql laravel laravel-routing laravel-5.2

我是laravel的新手,我目前正在laravel 5.2做一个研究项目。该项目只是一个简单的网站,有3个页面(Home, About Us, Contact Us)从数据库中获取每个页面内容,主页有幻灯片显示。为此,我下载了一个免费的响应式html模板,并将其分为header.blade.phpslideshow.blade.phpfooter.blade.php,并将其存储在includes文件夹下名为view的文件夹中。主布局文件default.blade.php存储在layouts文件夹下名为view的文件夹中。我在主布局文件header.blade.php中添加了这些slideshow.blade.phpfooter.blade.phpdefault.blade.php,以形成完整的网络模板。

我的default.blade.php文件代码如下:

<!DOCTYPE html>
<head>
        @include('guest.includes.head')
</head>
<body>
    <div class="wrap-body">

        <header>    
            @include('guest.includes.header')
        </header>   

        @if(Request::is('/'))
            @include('guest.includes.slideshow')    
        @endif

        @yield('content')

        <footer class="zerogrid">
            @include('guest.includes.footer')
        </footer>

    </div>
</body>
</html>

在header.blade.php中,我有一些信息,比如电话号码,电子邮件,网站地址,这些信息都是从数据库中提取的,并在我的所有3个页面上显示数据以及来自db的每个页面内容。为此,我在share()的{​​{1}}方法中使用boot函数在我的所有网页上共享和显示我的标题数据。

我当前的AppServiceProvider.php代码如下所示:

slideshow.blade.php

在这里你可以看到我已经对上面的幻灯片幻灯片项目详细信息(<div class="zerogrid"> <div class="callbacks_container"> <ul class="rslides" id="slider4"> <li> <img src="assets/images/banner1.jpg" alt=""> <div class="caption"> <h2>Title 1</h2></br> <p>Description 1</p> </div> </li> <li> <img src="assets/images/banner2.jpg" alt=""> <div class="caption"> <h2>Title 2</h2></br> <p>Description 2</p> </div> </li> </ul> </div> </div> )进行了硬编码。到这一部分工作正常,我通过slideimage, title, description从数据库到服务器获取头数据到所有页面,每个页面内容来自db通过路由/控制器和上面说的幻灯片。

我的header.blade.php代码如下:

routes.php

我的控制器页面(Route::get('/', 'GuestController@home'); Route::get('aboutus', 'GuestController@aboutus'); Route::get('contactus', 'GuestController@contactus'); )代码如下:

GuestController.php

现在我想让幻灯片显示也是动态的。我的意思是从db本身获取幻灯片项目详细信息(幻灯片图像,标题,描述)。为此,我创建了一个名为namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use DB; class GuestController extends Controller { public function home() { $result=DB::table('contents')->where('menuname','home')->get(); return view('guest.home')->with('data',$result); } public function aboutus() { $result=DB::table('contents')->where('menuname','aboutus')->get(); return view('guest.aboutus')->with('data',$result); } public function contactus() { $result=DB::table('contents')->where('menuname','contactus')->get(); return view('guest.contactus')->with('data',$result); } } 的表格,其中包含字段slideshowslideimagetitle。但我不知道如何从db中的两个独立表(description&amp; slideshow)中获取和显示数据到单个网页。

(在我的情况下,实际上在我的主页中它将从db获取3组数据。第一组数据是来自contents表的标题数据,它将显示标题数据,如电话,电子邮件,网站等我的所有页面都包括主页通过headers功能,第二组数据是来自内容表的主页内容通过路由/控制器页面。这两个已经工作,现在也想从{{1获取幻灯片显示的数据db中的表,这是我要在主页上显示的第三组数据。)

此要求的任何解决方案?请帮忙!提前谢谢......

3 个答案:

答案 0 :(得分:1)

当我按照上述问题的要求搜索我的要求的各种解决方案时,我发现可以通过修改上面的fetching and displaying datas from two tables inside a single view方法来完成满足home()这一要求的简单方法。给出控制器页面代码(GuestController.php),如下所示:

public function home() {
   $homecontent=DB::table('contents')->where('menuname','home')->get();
   $slideshow=DB::table('slideshow')->get();
   return view('guest.home')->with('homecontent',$homecontent)->with('slideshow',$slideshow);
}   

然后在slideshow.blade.php循环内部slideshow变量的结果如:

<ul class="rslides" id="slider4">     
   @foreach($slideshow as $row)
       <li>
           <img src="assets/images/{{$row->slideimage}}" alt="">
           <div class="caption">
               <h2>{{$row->title}}</h2></br>
               <p>{{$row->description}}</p>
           </div>
       </li>          
    @endforeach
</ul>

和幻灯片一样,在主页文件中循环homecontent变量的内容,如:

@foreach($homecontent as $row)
    <article>
        <div class="art-header">
            <a href="#"><h3>{{$row->contenttitle}}</h3></a>
        </div>
        <div class="art-content">
            <img src="assets/images/{{$row->contentimage}}" />
            <p align="justify">{{$row->contentdescription}}</p>
        </div>
    </article>           
@endforeach

任何其他页面都不需要进行其他更改,它将在主页内显示幻灯片和主页内容,以及包括主页在内的所有页面上header表中的共享标题数据。

答案 1 :(得分:0)

您已经回答了自己的问题,您应该选择它作为此主题的答案。

(评论太短,这就是我给你写答案的原因)

既然你说自己在教自己Laravel,我强烈建议你看this course。这是一个免费的,它似乎帮助了很多人。尽管我之前有过使用该框架的经验,但它确实对我有所帮助。

无论如何,你知道你是如何写一个项目然后一年后来的,并且想一想“当我写这个时,我在想什么?”所以我相信我们应该清楚准确地命名我们的东西只是为了拯救我们未来的自我灵魂。

我希望你把这当作一种积极的批评而不是抨击你。尊重你们,我只想在这里传达一些智慧......

我的意思是:

1)您将控制器命名为GuestController。但是你没有guests表。可能你也没有users表。客人在哪里?你的控制器应该更像HomeControllerFrontController的命名,甚至可以分成不同的控制器。

"NewsController"

基本规则是“一个表 - 一个模型 - 一个控制器”,所以首先,您可能不应该将您的文章与页面内容放在同一个表中。经验丰富的开发人员会做的是有两个单独的表。因此可能是NewsController的新闻,新闻模型和news表。然后是pages表的另一个控制器,一个Page模型和一个PagesController。

2)

"PagesController"

您可以在这里放置主页关于页面。

所以

class PagesController {
    public function home(){ } //will show your slideshow and news feed
    public function about() { } //will show the 'about' content from `contents`/`articles` table
}

然后另一个

class NewsController(){ 
    public function show($id) { } //will show a single `news` article
}

取决于您的网站架构   - 让幻灯片可以通过网站的前部进行编辑,或者使用/ admin /目录和另一组控制器,您可以在其中添加另一个 SlideController NewsController ,您可以在其中添加并编辑新闻和幻灯片   - 或添加控制器到网站的前部以添加/编辑新闻和幻灯片

希望它有助于你的方式! 此致

答案 2 :(得分:-1)

我建议使用ParentChanged 这个模型是这样的

namespace App;

use Illuminate\Database\Eloquent\Model;

class Slideshow extends Model
{
    protected $table='slideshow';
}

然后控制器如此写

namespace App\Http\Controllers;

use App\Slideshow;
use App\Contents;

 public function __construct(Contents $contents)
{
    $contents=$contents->get();
    view()->share('data', $contents);
}

class GuestController extends Controller
{

public function home() {
    $slideshows=Slideshow::where('menuname','home')->get();
    return view('guest.home', [ 'slideshows'=>$slideshows]);
}   
public function aboutus() {
    return view('guest.aboutus', []);
}   
public function contactus() {
    return view('guest.contactus', []);
}   

P.S。不要忘记注册内容模型