【问题标题】:Laravel 4.2 Array to String conversion errorLaravel 4.2 数组到字符串转换错误
【发布时间】:2016-09-01 13:20:24
【问题描述】:

我正在尝试根据 URL 字符串为模型中的 $table 属性分配一个值。我收到“数组到字符串转换”错误。以下是代码级别的详细信息。有人可以帮忙吗?谢谢。

我已经对我的模型 __constructor() 进行了编码,如下所示。

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class Disaster extends Eloquent {

    use UserTrait,
        RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table;

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

    public function __construct($disasterArea, $disaster = "flood") {

               $this->table = $disasterArea . '_' . $disaster;

    }

}

我试图在从我的控制器进行模型实例化时传递所需的值,如下所示。

class DisasterController extends \BaseController {

    public function getFloodTweets($floodArea){
        $flood = new Disaster($floodArea, "floods");
        $floodTweets = $flood->orderBy('created_at','desc')->groupBy('tweets')->paginate(10);
        $floodAreaUc = ucfirst($floodArea);
        return View::make("disaster.floodTweets",['title'=>"$floodAreaUc Flood",'floodTweets'=>$floodTweets,'floodArea'=>$floodAreaUc]);
        
    }
        
    }
}

这意味着如果我触发像 www.example.com/floods/city 这样的 URL,我的模型应该将表构建为“city_floods”,这是我们遵循的命名约定。 而且,我观察到表名正在正确构建但抛出此错误。奇怪的是,当我硬编码这个表名时,我的代码工作正常。即

$this->table = "city_floods" 工作正常,但 $this->table = $disasterArea 。 '_' 。 $disaster 没有。我不明白有什么区别。有人可以建议我在哪里做错了。

我使用 Laravel 4.2 框架在 UBUNTU 14.04 上工作。

编辑

【问题讨论】:

  • 尝试将变量记录在__construct 中,然后再将其分配给表。然后你就可以看到到底传递了什么。
  • @aynber 你的意思是显示变量?
  • 是的。 Log::info($disasterArea); 会将变量写入您的日志文件,该文件通常存储在 app/storage/logs 中。
  • 好的。我记录了 Log::info($disasterArea);和日志::信息($灾难);变量。我可以将它们视为二维数组。 [2016-05-06 13:10:31] production.INFO:阿萨姆 [] [] [2016-05-06 13:10:31] production.INFO:洪水 [] []
  • 它们实际上是字符串。 [][] 是它放在所有日志行末尾的内容。错误消息是否来自代码的特定行?

标签: php laravel-4 ubuntu-14.04


【解决方案1】:

好吧,您不能以这种方式将数据传递给 eloquent 模型,因为原始抽象 eloquent 模型的第一个参数为array!它会尝试以这种方式放置。

编辑

正如您在屏幕截图中看到的那样 - 模型正在使用 newInstance 方法在某处解析,这意味着它试图将(可能)一个空数组放入您的字符串变量中。

解决方案

最好的选择是将逻辑拆分为几个灾难模型,扩展主要的 Disaster 模型并像这样从工厂解决它们:

class UsaFloodDisaster extends Disaster
{
    protected $table = 'usa_flood';
}

class FranceFloodDisaster extends Disaster
{
    protected $table = 'france_flood';

}

(...)

class DisasterFactory
{
    public function make($area, $disaster = 'flood')
    {
        $className = ucfirst(camel_case($area.'_'.$disaster));

        return app($className);
    }

}

那么您的控制器将如下所示:

class DisasterController extends \BaseController {

    public function getFloodTweets($floodArea){
        $flood = app(DisasterFactory::class)->make($floodArea, "floods");
        $floodTweets = $flood->orderBy('created_at','desc')->groupBy('tweets')->paginate(10);
        $floodAreaUc = ucfirst($floodArea);
        return View::make("disaster.floodTweets",['title'=>"$floodAreaUc Flood",'floodTweets'=>$floodTweets,'floodArea'=>$floodAreaUc]);

    }
}

【讨论】:

  • 好的,我告诉你我为什么要这样做。我们正在构建一个博客类型的应用程序,我们在其中显示有关不同地方/国家灾难的帖子。为此,我需要访问多个表。而且我不想为每个表创建新模型。您能否建议是否有任何适当的替代方法可以在一个 Disaster.php 模型中处理所有表?
  • 当然我会写在上面。
  • 这是我理解的。我将有两个文件,一个带有原始 Disaster.php 模型,另一个带有您给出的解决方案。从我的控制器中,我需要始终从第二个文件访问工厂类来构建我的表名。如果我错了,请纠正我。
  • 几乎...您将拥有具有父级的模型的许多文件(对于每个表一个):Disaster - 您将通过工厂调用它们 - 这是一种您可以阅读的设计模式它在网络上。
  • 没有。我试图避免多个文件。有什么不同?无论如何,我尝试在我的模型中使用 switch 语句来构建表名。我不知道这是否有效,但到目前为止它已经达到了我的目的:)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 2019-05-01
  • 2022-01-25
  • 1970-01-01
  • 2014-12-14
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多