【问题标题】:How to route, fetch and display data from two tables in db to a single webpage in laravel 5.2如何从 db 中的两个表中路由、获取和显示数据到 laravel 5.2 中的单个网页
【发布时间】:2016-06-04 07:27:02
【问题描述】:

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

我的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 的每个页面内容。为此,我在AppServiceProvider.phpboot 方法中使用了share() 函数,在我的所有网页上共享和显示我的标题数据。

我当前的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)。到目前为止,这部分工作正常,我通过header.blade.php 将标头数据从 db 获取到服务器到所有页面,每个页面内容都通过 Routes/Controllers 和上述幻灯片从 db 获取。

我的routes.php 代码如下:

Route::get('/', 'GuestController@home');
Route::get('aboutus', 'GuestController@aboutus');
Route::get('contactus', 'GuestController@contactus');

我的控制器页面(GuestController.php)代码如下:

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);
    }   
}

现在我想让幻灯片也变得动态。我的意思是也从 db 本身获取幻灯片项目的详细信息(幻灯片图像、标题、描述)。为此,我创建了一个名为slideshow 的表,其中包含slideimagetitledescription 字段。但我不知道如何从 db 中的两个独立表 (slideshow & contents) 中获取和显示数据到单个网页。

(在我的例子中,实际上在我的主页中,它将从数据库中获取 3 组数据。第一组数据是来自headers 表的标题数据,它将向我所有的人显示电话、电子邮件、网站等标题数据页面包括通过share() 函数的主页,第二组数据是通过路由/控制器页面从内容表中获取的主页内容。这两个已经在工作,现在我想从数据库中的slideshow 表中获取幻灯片的数据,其中是我要在主页上显示的第三组数据。)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    既然你说你在自学 Laravel,我强烈建议你观看 this course。它是免费的,它似乎对人们有很大帮助。尽管我以前有过使用该框架的经验,但它当然也对我有帮助。

    不管怎样,你知道你是如何写一个项目的,然后你一年后来想“我写这个的时候……我在想什么?”所以我认为,为了拯救我们未来的自己的灵魂,我们应该清楚准确地命名我们的事物。

    我希望你把它当作一个积极的批评,而不是在抨击你。恕我直言,我只是想在这里传达一些智慧......

    我到底是什么意思:

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

    "NewsController"
    

    基本规则是“一个表格 - 一个模型 - 一个控制器”,因此首先您可能不应该将文章与页面内容放在同一个表格中。有经验的开发人员会做的是为它们准备两个单独的表。所以可能是 NewsController 用于新闻,一个 News 模型和一个 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】:

      当我按照上述问题的要求搜索各种解决方案时,我发现满足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表的共享标题数据。

      【讨论】:

      • 我赞成你的答案,因为我认为它应该被选为问题的答案,但是也请看看我的答案,我试图在那里给你一些想法。干杯!
      【解决方案3】:

      我推荐使用Eloquent ORM 模型是这样制作的

      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', []);
      }   
      

      附:不要忘记注册内容模型

      【讨论】:

      • 我认为您使用 Eloquent 模型的方法也有效。但是这个简单的要求需要吗?当我搜索时,我发现了一些其他简单的方法可以在一个页面中显示来自两个表的数据,并且我只修改了我当前的控制器(GuestController.php)页面代码,它可以工作。
      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 2016-05-22
      • 1970-01-01
      • 2021-01-19
      • 2016-08-30
      • 2016-06-03
      • 1970-01-01
      • 2016-12-24
      相关资源
      最近更新 更多