在laravel 5.2中找不到replicate()方法

时间:2016-09-22 02:34:31

标签: php laravel eloquent laravel-5.2 replicate

我正在尝试复制表行及其关系。

但是我收到错误信息,表明replicate()不存在,

enter image description here

我在stackoverflow上看到很多人使用了replicate()没有任何问题,但是我收到了这个错误

我的控制器代码

 public function copyshowtime($cinema_id,$show_date)
{
    $date=new Carbon($show_date);
    $current_show_date=$date->format('Y-m-d');
    $next_show_date=$date->addDay()->format('Y-m-d'); 

    $movieshowtime=Movies_showtimes::with('showdata')->where([['cinema_id','=',$cinema_id],['show_date','=',$current_show_date]])->get();

    $newshowtime=$movieshowtime->replicate();
    return $newshowtime;


}

我是否需要使用任何名称空间来使用replicate(),我也无法从laravel网站获得解决方案。

帮助表示赞赏。

4 个答案:

答案 0 :(得分:0)

您可以在模型上使用replicate(),但不能在集合上使用。

通过使用get()获取记录,您将返回一个集合。

如果您只是希望返回一条记录,那么将get()替换为first(),然后replicate()应该存在,因为它将返回模型的实例而不是集合:

public function copyshowtime($cinema_id,$show_date)
{
    $date=new Carbon($show_date);
    $current_show_date=$date->format('Y-m-d');
    $next_show_date=$date->addDay()->format('Y-m-d'); 

    $movieshowtime=Movies_showtimes::with('showdata')->where([['cinema_id','=',$cinema_id],['show_date','=',$current_show_date]])->first();

    $newshowtime=$movieshowtime->replicate();
    return $newshowtime;
}

您还需要save() $newshowtime

答案 1 :(得分:0)

这段代码非常适合我

 public function copyshowtime($cinema_id,$show_date)
{
    $date=new Carbon($show_date);
    $current_show_date=$date->format('Y-m-d');
    $next_show_date=$date->addDay()->format('Y-m-d'); 

    $movieshowtime=Movies_showtimes::with('showdata')->where([['cinema_id','=',$cinema_id],['show_date','=',$current_show_date]])->get();

    foreach ($movieshowtime as $item) 
    {
        $item->show_date=$next_show_date;
        $item->show_id=NULL;
        $newshowtime=$item->replicate();
        $newshowtime->push();


        foreach ($item->showdata as $sd) 
        {


            $newshowdata = array(
                                    'showdata_id' => NULL,
                                    'show_id'=>$newshowtime->id,
                                    'category_id'=>$sd->category_id,
                                    'showdata_category'=>$sd->showdata_category,
                                    'showdata_rate'=>$sd->showdata_rate

                                );


           // print_r($newshowdata);
            Movies_showdata::create($newshowdata);



        }
    }

    return redirect()->back();


}

任何改进此代码的建议都将受到赞赏。

答案 2 :(得分:0)

这种类型的函数将有助于克隆多个记录并将这些记录添加到同一表中。我尝试了类似的代码流程并开始工作。

/**
* Clone multiple records in same table
*
* @params int $cinemaId
* @params string $showDate
*
* @return bool $status
*
* @access public
*/
public function copyShowTime($cinemaId, $showDate)
{
    $date = new Carbon($showDate);
    $currentShowDate = $date->format('Y-m-d');

    // Cloned & Create new records
    $moviesShowTimeCollection = Movies_showtimes::with('showdata')->where([['cinema_id','=',$cinemaId],['show_date','=',$currentShowDate]])->get();
    // Please check that Model name should change according to camelCases - Movies_showtimes to MoviesShowtimes
    if(!$moviesShowTimeCollection->isEmpty()) {
        $moviesShowTimeData = $moviesShowTimeCollection->toArray();
        foreach ($moviesShowTimeData as $key => $value) {
            $primaryKey = 'show_id'; // Needs to check the table primary key name
            $primaryId = $value[$primaryKey];
            $moviesShowTimeObj = Movies_showtimes::find($primaryId);
            // below code can modify while cloaning 
            //$clonedMoviesShowTimeObj = $moviesShowTimeObj->replicate()->fill([
            //    'column_name' => $updatedValue
            //]);
            $clonedMoviesShowTimeObj = $moviesShowTimeObj->replicate(); // just to clone a single record
            $status = $clonedMoviesShowTimeObj->save();
        }
    }
}

干杯!

答案 3 :(得分:0)

您可以轻松地复制具有新更改的行

$apcntReplicate = TrademarkApplicantMap::where('trademark_id', $trdIdForPostAssesment)->get();

foreach($apcntReplicate as $oldapnctdata) 
{
   $apcntreplicated = $oldapnctdata->replicate() ;

   //update row data which will newly created by replicate 
   $apcntreplicated->row_name =  $newrowdata;

   //save new replicated row
   $apcntreplicated->save();
}

不要使用toArray(),那么foreach循环中的每个元素都是一个雄辩的对象。